參考這個流映射寫的:
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())));
