patternjavaModerate
Split Collection to two list depend on criteria
Viewed 0 times
criteriacollectionsplittwolistdepend
Problem
Let's say I have a List contains numbers:
1,2,3,4,5,6,7,8,9
and I would like to split this to two lists:
So I can do this two ways:
Solution 1:
Create two methods:
and in the code I will call:
and do something with these lists.
Disadvantage:
I do two loops over one collection.
Solution 2:
Create one method:
and in the code I will call:
Disadvantage:
I hear that assigning results for parameters is bad practice.
Which solution is better?
1,2,3,4,5,6,7,8,9
and I would like to split this to two lists:
- odd numbers
- even numbers
So I can do this two ways:
Solution 1:
Create two methods:
List filterOdd(List numbers){
List result = new ArrayList();
for(Integer n : numbers){
if(n % 2 != 0){
result.add(n);
}
}
return result;
}
List filterEven(List numbers){
List result = new ArrayList();
for(Integer n : numbers){
if(n % 2 == 0){
result.add(n);
}
}
return result;
}and in the code I will call:
List numbers = Arrays.asList(new Integer[] { 1,2,3,4,5,6,7,8,9 });
List oddNumbers = filterOdd(numbers);
List evenNumbers = filterEven(numbers);and do something with these lists.
Disadvantage:
I do two loops over one collection.
Solution 2:
Create one method:
public void filter(List numbers, List oddNumbers, List evenNumbers){
for(Integer n : numbers){
if(n % 2 != 0){
oddNumbers.add(n);
}else{
evenNumbers.add(n);
}
}
}and in the code I will call:
List numbers = Arrays.asList(new Integer[] { 1,2,3,4,5,6,7,8,9 });
List oddNumbers = new ArrayList();
List evenNumbers = new ArrayList();
filter(numbers, oddNumbers, evenNumbers);Disadvantage:
I hear that assigning results for parameters is bad practice.
Which solution is better?
Solution
As already mentioned in the other answers, in Java 8 you can use lambdas and the stream API to remove a lot of boilerplate.
Both your solutions can be converted to use streams.
Solution 1 - two methods:
Solution 2 - as single method:
Both your solutions can be converted to use streams.
Solution 1 - two methods:
public List oddNumbers(List numbers) {
return numbers.stream().filter(n -> (n % 2) != 0).collect(Collectors.toList());
}
public List evenNumbers(List numbers) {
return numbers.stream().filter(n -> (n % 2) == 0).collect(Collectors.toList());
}Solution 2 - as single method:
public void filter(List numbers, List oddNumbers, List evenNumbers) {
Map> partitions = numbers.stream().collect(Collectors.partitioningBy(n -> (n % 2) == 0));
evenNumbers.addAll(partitions.get(true));
oddNumbers.addAll(partitions.get(false));
}Code Snippets
public List<Integer> oddNumbers(List<Integer> numbers) {
return numbers.stream().filter(n -> (n % 2) != 0).collect(Collectors.toList());
}
public List<Integer> evenNumbers(List<Integer> numbers) {
return numbers.stream().filter(n -> (n % 2) == 0).collect(Collectors.toList());
}public void filter(List<Integer> numbers, List<Integer> oddNumbers, List<Integer> evenNumbers) {
Map<Boolean, List<Integer>> partitions = numbers.stream().collect(Collectors.partitioningBy(n -> (n % 2) == 0));
evenNumbers.addAll(partitions.get(true));
oddNumbers.addAll(partitions.get(false));
}Context
StackExchange Code Review Q#27724, answer score: 10
Revisions (0)
No revisions yet.