请考虑以下代码:
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());
我想在这里做的是将一个列表中的偶数和奇数值从不同的列表中获取.
流过滤器()方法对偶数项返回true,流收集器将收集它们.
对于奇数情况,过滤器将返回false,并且项目将永远不会到达收集器.
所以我在另外一个列表中添加了这样的奇数,而在另一个列表中我创建了在其他块下.
我知道这不是使用流的优雅方式.例如,如果我使用并行流,那么将会出现奇数列表中的线程安全问题.由于性能原因,我不能多次使用不同的过滤器(应该是O(n)).
这只是一个用例的例子,列表可以包含任何对象,并且过滤器中的lambda需要根据一些逻辑将它们分离成单独的列表.
简单来说:从列表创建多个列表,其中包含基于某些条件分离的项目.
没有流,它将只是运行一个for循环,并做简单的if else,并根据条件收集项目.
解决方法
以下是一个示例,说明如何以偶数和奇数分隔此列表的元素(数字):
List<Integer> myList = Arrays.asList(1,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);
您可以在partitionsBy中传递任何需要逻辑的lambda.