我正在研究Java8,希望在Java8中使用stream API执行以下操作。
输入: List of (1,2,3,4,5,6,7,8,9)
输出:奇数列表- (1,3,5,7,9)偶数列表- (2,4,6,8)
在传统的java中,我可以在单个for循环中完成这个操作。
List<Integer> ints = Arrays.asList(3,4,2,5,6,7,4,5);
List<Integer> oddList = new ArrayList<>();
List<Integer> evenList = new ArrayList<>();
for (Integer i : ints) {
if (i % 2 == 0) {
evenList.add(i);
} else {
oddList.add(i);
}
}我知道一个Java8风格的方法,如下所示-
List<Integer> evens = ints.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
List<Integer> odds = ints.stream().filter(i -> i % 2 == 1).collect(Collectors.toList());但这里的问题是,我迭代int两次而不是一次。有没有一种方法可以做到这一点,而不需要在流中迭代两次?
发布于 2021-02-10 11:16:54
使用partitioningBy收集器。它将流收集到一个映射中,该映射有两个列表。一个列表包含满足谓词的元素,另一个列表包含不满足谓词的元素。
Map<Boolean, List<Integer>> partitions = ints.stream()
.collect(Collectors.partitioningBy(x -> x % 2 == 0));
List<Integer> evens = partitions.get(true);
List<Integer> odds = partitions.get(false);https://stackoverflow.com/questions/66130390
复制相似问题