java8 Stream将List转成Map
在日常开发过程中,后端的小伙伴为了构造特定的数据格式给前端,无法避免需要将List数据转化成Map数据,那么请问遇到这样的问题,你们会如何去完成这件事情呢? 一般来说,肯定是通过遍历的方式去完成数据的转化。但Java 8 有Stream,我们能用它来做点有趣的事情。
假如我们有一个类Product,如下面的代码所示。
@Getter
@Setter
@ToString
@Builder
class Product{
private Long id;
private String category;
private String name;
}
我们现在获取到了List格式的数据。
static List<Product> getList(){
final List<Product> productList = new ArrayList<>(100);
for(int i =1;i<=100;i++){
productList.add(Product.builder()
.id((long) i)
.name("name"+i)
.category("category"+i%9)
.build());
}
return productList;
}
现在,我们要获取以id为key,name为value的Map格式数据,代码如下。
Map<Long, String> map = productList.stream().collect(Collectors.toMap(Product::getId, Product::getName));
那如果要获取以id为key,product为value的Map格式数据,代码如下。
Map<Long, Product> map = productList.stream().collect(Collectors.toMap(Product::getId, data -> data));
那如果要获取以category为key,name为value的Map格式数据,key可能会冲突,如何解决呢,需要传入key冲突解决的策略,代码如下。
#冲突发生时,保留先存在的数据,可按照业务自定义
Map<String, String> map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing));
那如果要最终获取线程安全的Map,如何解决呢,需要传入一个Supplier<M> mapSupplier
,代码如下。
#这里引入的是ConcurrentHashMap,同样的也可以用TreeMap的实现
ConcurrentHashMap<String, String> map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing, ConcurrentHashMap::new));
来自:
Java8 | 如何优雅地初始化Map & List2Map ? - 掘金