如何用Java 8 Stream及Lambda改写遍历集合批量添加元素的代码?
使用Java 8 Stream重构循环的最佳方式
这题我太熟悉了!你原来的循环是遍历myObjects,把每个对象ID对应的List<Long>都合并到myIds里,用Java 8 Stream的话,**flatMap**就是最适配的工具——它能把多个嵌套的集合“展平”成一个连续的流,完美匹配你的需求。
直接上重构后的代码:
final List<Long> myIds = myObjects.stream() .map(Obj::getId) // 把每个Obj对象映射为对应的ID .flatMap(id -> daoClass.findItemsById(id).stream()) // 将每个ID返回的List<Long>转成流并展平 .collect(Collectors.toList()); // 把最终的流收集为List<Long>
代码细节解释:
myObjects.stream():将集合转换为Stream,开启流式操作的入口map(Obj::getId):用方法引用简化了ob -> ob.getId()的写法,快速完成从Obj到ID的转换flatMap(...):这是核心逻辑!对于每个ID,调用findItemsById得到List<Long>后转成Stream,flatMap会自动把所有这些小流合并成一个单一的Long流,避免了嵌套集合的处理麻烦collect(Collectors.toList()):替代原代码的addAll操作,把流中的元素收集成最终的列表
如果你需要严格保持和原代码一致的ArrayList类型(大部分场景下List接口已足够),可以把收集器改成:
.collect(Collectors.toCollection(ArrayList::new));
这种写法是典型的声明式编程——你只需要告诉程序“要做什么”,不用关心遍历、合并这些底层细节,代码更简洁,可读性和维护性也更强。
内容的提问来源于stack exchange,提问作者R111
相关产品推荐
相关产品推荐

