【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 @   酷酷-  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示