使用流 API 将数字列表拆分为两个单独的奇数和偶数列表

Har*_*ish 1 java java-8 java-stream

我正在学习Java8,想要使用Java8中的流API执行以下操作。

输入: (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);
    }
}
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)

但这里的问题是我迭代了两次而不是一次整数。有没有一种方法可以做到这一点而无需在流中迭代两次?

Swe*_*per 5

使用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)

  • 如果它们是不相交的组(即负数既不是奇数也不是偶数),您可以使用“groupingBy”。@哈里什 (2认同)