Consider the following code:
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());
What I am trying to do here is get the even and odd values from a list into separate lists.
The stream filter()
method returns true
for even items and the stream collector will collect them.
For the odd case, the filter will return false
and the item will never reach the collector.
So I am adding such odd numbers in another list I created before under the else
block.
I know this is not an elegant way of working with streams. For example if I use a parallel stream then there will be thread safety issue with the odd list. I cannot run it multiple times with different filters because of performance reasons (should be O(n)).
This is just an example for one use-case, the list could contain any object and the lambda inside the filter needs to separate them based on some logic into separate lists.
In simple terms: from a list create multiple lists containing items separated based on some criteria.
Without streams it would be just to run a for loop and do simple if-else and collect the items based on the conditions.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…