I tried to create two lists - odds and evens as follows:
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 5, 8, 13, 21));
List<Integer> odds = new ArrayList<>();
List<Integer> evens = new ArrayList<>();
numbers.stream().forEach(x -> x % 2 == 0 ? evens.add(x) : odds.add(x));
}
But it gave me incompatible types error (bad return type in lambda expression missing return value)
What is the best way to filter a collection to two new collections?
Well, you can make your existing code compile with a trivial modification:
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 5, 8, 13, 21));
List<Integer> odds = new ArrayList<>();
List<Integer> evens = new ArrayList<>();
numbers.stream().forEach(x -> (x % 2 == 0 ? evens : odds).add(x));
}
The conditional ?:
operator is an expression, which isn't a valid statement on its own. My modified code changes the use of the conditional operator to just select which list to add to, and then calls add
on it - and that method invocation expression is a valid statement.
An alternative would be to collect
using Collectors.partitioningBy
- although in this particular case that would probably be more confusing code than what you've got.
See more on this question at Stackoverflow