Har*_*ish 1 java java-8 java-stream
我正在学习Java8,想要使用Java8中的流API执行以下操作。
输入: (1,2,3,4,5,6,7,8,9) 列表
我可以在传统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);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道一种以 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());
Run Code Online (Sandbox Code Playgroud)
但这里的问题是我迭代了两次而不是一次整数。有没有一种方法可以做到这一点而无需在流中迭代两次?
使用partitioningBy收集器。它将流收集到一个映射中,该映射有 2 个列表。一个列表包含满足谓词的元素,另一个列表包含不满足谓词的元素。
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3663 次 |
| 最近记录: |