考虑下面的代码:如何通过使用Java 8的条件分隔列表中的流
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()
方法为偶数项返回true
并且流收集器将收集它们。
对于奇怪的情况,过滤器将返回false
,并且该物品将永远不会到达收集器。
因此,我在else
块之前的另一个列表中添加了这样的奇数。
我知道这不是一个使用流的优雅方式。例如,如果我使用并行流,那么奇数列表将会出现线程安全问题。由于性能原因,我不能使用不同的过滤器多次运行它(应该是O(n))。
这只是一个用例的例子,该列表可能包含任何对象,并且过滤器内部的lambda需要根据某些逻辑将它们分离为单独的列表。
简而言之:从列表中创建包含基于某些条件分离的项目的多个列表。
没有流它只是运行一个for循环,并做简单的if-else并根据条件收集项目。
看着'Collectors.groupingBy' /'Collectors.partitioningBy' –
'Potenually answers by http://stackoverflow.com/questions/19940319/can-you-split-a-stream-into-twostreams –
'item/2 == 0'不会分隔偶数和奇数。你需要'项目%2 == 0' –