HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaModerate

Split Collection to two list depend on criteria

Submitted by: @import:stackexchange-codereview··
0
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:

  • 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:

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.