【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)))));
加油。
分类:
代码写法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了