参考这个流映射写的:
stream 分组(group)和map的值映射mapping
我们经常写那种分组查询的操作:根据某个id,分组聚合成Map<Long,List<String>> 类似这样的语法。
发现一个for和别的组合在一起,比较好,单独的一个流操作n次,本来用for可以解决的问题,使用了多次的流操作,看着花里胡哨的,实际上性能并没有提升,反而下降了不少。
public static void main(String[] args) { List<FloorElement> elementList=new ArrayList<>(); FloorElement element=new FloorElement(); element.setId(1l); element.setFloorId(1l); elementList.add(element); FloorElement element2=new FloorElement(); element2.setId(2l); element2.setFloorId(1l); elementList.add(element2); Map<Long, List<FloorElement>> map = new HashMap<>(); for (FloorElement value : elementList) { map.computeIfAbsent(value.getFloorId(), k -> new ArrayList<>()).add(value); } //打印的结果是两条数据,是分组的结果,根据id ,变种的写法 elementList.stream() .collect(Collectors.groupingBy(FloorElement::getFloorId, Collectors.mapping(value->value, Collectors.toList()))); }
例子2:
Map<Long, List<ProductDto>> productsMap = new HashMap<>();
products.forEach(product -> {
if (productsMap.containsKey(product.getPoId())) {
productsMap.get(product.getPoId()).add(product);
} else {
List<ProductDto> productList = new ArrayList<>();
productList.add(product);
productsMap.put(product.getPoId(), productList);
}
});
上面的操作按照流的惯例:
Map<Long, List<ProductDto>> collect = products.stream().collect(Collectors.groupingBy(ProductDto::getPoId,
Collectors.mapping(value -> value, Collectors.toList())));