Java Stream能否在单次过滤操作中同时获取符合与不符合条件的元素?
可以仅通过一次流式操作完成该拆分需求,不需要先调用filter方法,使用JDK内置的Collectors.partitioningBy()收集器即可实现。
partitioningBy接收一个断言(Predicate)作为分区条件,会自动将流中所有元素分为「满足条件」和「不满足条件」两组,返回结果为Map<Boolean, List<T>>类型,其中key=true对应的列表存储满足条件的元素,key=false对应的列表存储其余元素。
完整实现代码
首先修正示例列表的规范写法:
List<String> elements = List.of("e1", "el2", "el3", "4 el", "5 el");
核心流处理逻辑:
import java.util.stream.Collectors; import java.util.List; import java.util.Map; Map<Boolean, List<String>> splitResult = elements.stream() .collect(Collectors.partitioningBy(s -> s.startsWith("el")));
结果获取
- 以
el开头的元素列表:splitResult.get(true),运行结果为["el2", "el3"] - 其余元素列表:
splitResult.get(false),运行结果为["e1", "4 el", "5 el"]
该实现全程仅对列表做一次遍历,无需提前过滤丢弃元素,相比两次调用filter分别收集的实现方式,在数据量较大的场景下性能优势更明显。
内容的提问来源于stack exchange,提问作者Nabil El haouari
相关产品推荐
相关产品推荐

