【Java】Stream的一些日常操作

1  前言

 Java8 出来的 stream 写法让我们对数据的处理带来了一些写法上的增进,这节就简单记录下平时使用的 stream 的一些操作,关于 stream 的书籍,可以看一下 Java8实战,里边会有两三章讲解我们的 stream。

2  常用记录

// 根据单个属性或者多个属性去重  比如根据仓库+日期去重
List<Object> data = list.stream().collect(Collectors.collectingAndThen(
    Collectors.toCollection(
            () -> new TreeSet<>(Comparator.comparing(item -> item.getWarehouseCode() + item.getBusinessDate()))
    ), ArrayList::new
));

// 分组指定map类型
LinkedHashMap<String, List<Object>> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode, LinkedHashMap::new, Collectors.toList()));
// 多次分组 根据仓库编码分组再根据商品编码分组
Map<String, Map<String, List<Object>>> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode,
                Collectors.groupingBy(Object::getRange)));
// 多次分组后取某一条信息
Map<String, Map<String, String>> dictMap = dictItemResDtoList.stream().collect(Collectors.groupingBy(Object::getDictCode
        , Collectors.groupingBy(Object::getDictItemCode, Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0).getDictItemName()))));            
// 分组后取第一条记录
Map<String, Object> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode,
                Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0))));

// 分组汇总                
// 分组后根据某个属性求和 int型
Map<String, Integer> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode,
        Collectors.summingInt(Object::getNum)));
// 分组后根据某个属性求和 BigDecimal型
Map<String, BigDecimal> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode,
        Collectors.mapping(Object::getAvg, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
// 分组后收集某个属性的值
Map<String, List<String>> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode,
        Collectors.mapping(Object::getCode, Collectors.toList())));
// 分组后拼成字符串的
Map<String, String> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode,
        Collectors.mapping(Object::getCode, Collectors.joining(","))));
// 分组聚合明细的
Map<String, Object> newDetailList = detailList.stream().collect(Collectors.toMap(Object::getSkuCode, e -> e, (o, n) -> {
    n.setPlanQuantity(o.getPlanQuantity().add(n.getPlanQuantity()));
    return n;
}));
detailList = Lists.newArrayList(newDetailList.values());
    
// 分组汇总字段是集合类型的
List<Object> data = list.stream().collect(Collectors.groupingBy(Object::getWarehouseCode)).values().stream().flatMap(Collection::stream).collect(Collectors.toList());
// 多次分组求和
Map<String, Map<String, BigDecimal>> map = list.stream().collect(
        Collectors.groupingBy(A::getSkuCode
                , Collectors.groupingBy(B::getLotNumberCode
                        , Collectors.mapping(C::getPlanQuantity, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))));

加油。

posted @ 2023-05-11 11:03  酷酷-  阅读(41)  评论(0编辑  收藏  举报