如何使用 Java 8 流按条件分隔列表

2022-09-02 03:21:55

请考虑以下代码:

 List<Integer> odd = new ArrayList<Integer>();
 List<Integer> even = null;  
 List<Integer> myList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
 even = myList.stream()
              .filter(item -> {
                   if(item%2 == 0) { return true;}
                   else { 
                           odd.add(item); 
                           return false;
                   }
              })
              .collect(Collectors.toList());

我在这里试图做的是将列表中的偶数和奇数值放入单独的列表中。

流方法返回偶数项,流收集器将收集它们。
对于奇怪的情况,过滤器将返回,并且项目将永远不会到达收集器。filter()truefalse

因此,我正在将此类奇数添加到我之前在块下创建的另一个列表中。else

我知道这不是处理流的优雅方式。例如,如果我使用并行流,那么奇数列表将存在线程安全问题。由于性能原因,我无法使用不同的过滤器多次运行它(应该是O(n))。

这只是一个用例的示例,列表可以包含任何对象,并且过滤器内的lambda需要根据某些逻辑将它们分离到单独的列表中。

简单来说:从列表中创建多个列表,其中包含根据某些条件分隔的项目。

如果没有流,只需运行 for 循环并执行简单的 if-else 并根据条件收集项目。


答案 1

下面是如何以偶数和奇数分隔此列表的元素(数字)的示例:

List<Integer> myList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

Map<Boolean, List<Integer>> evenAndOdds = myList.stream()
        .collect(partitioningBy(i -> i % 2 == 0));

您将获得这样的偶数/奇数列表(任一列表可能为空):

List<Integer> even = evenAndOdds.get(true);
List<Integer> odd = evenAndOdds.get(false);

您可以在 中传递任何具有所需逻辑的 lambda。partitioningBy


答案 2

推荐