Logical Java 8 Filter

I want to be able to apply a filter based on a logical passed.

public static List<Integer> multiplyNumbers(List<Integer> input, boolean ignoreEven){ return input.stream() .filter(number -> !(number%2==0)) .map(number -> number*2) .collect(Collectors.toList()); } 

I want to make a filter step based on the ignoreEven flag. If true, ignore even numbers. How can I do it? I am doing this to avoid code duplication.

+5
source share
4 answers

Sounds like a simple or condition for me.

 .filter(number -> !ignoreEven || (number % 2 != 0)) 
+6
source

If you do not want to check ignoreEven for each element, you can define the predicate itself:

 .filter(ignoreEven ? (n -> n % 2 != 0) : (n -> true)) 
+4
source

You can pass the condition to your multiply(...) method and pass it to filter , as shown below.

 multiplyNumbers(Arrays.asList(1, 2, 3, 4, 5), (x) -> x % 2 != 0).forEach(System.out::println); public static List<Integer> multiplyNumbers(List<Integer> input, Predicate<Integer> filterCondition){ return input.stream() .filter(filterCondition) .map(number -> number*2) .collect(Collectors.toList()); } 
0
source

You can define two additional helper methods and compose them using the or() method:

 private static Predicate<Integer> ignoringEven(boolean ignoreEven) { return number -> !ignoreEven; } private static Predicate<Integer> ignoringOdd() { return number -> (number % 2 != 0); } 

Final result:

 return input.stream() .filter(ignoringEven(ignoreEven).or(ignoringOdd())) .map(number -> number * 2) .collect(Collectors.toList()); 
0
source

Source: https://habr.com/ru/post/1270205/


All Articles