我希望能够根据传入的布尔值应用过滤器。
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());
}
我想根据ignoreEven标志进行过滤步骤。如果是真的,请忽略偶数。我该怎么做呢?我这样做是为了避免代码重复
答案 0 :(得分:7)
对我来说听起来很简单或有条件。
.filter(number -> !ignoreEven || (number % 2 != 0))
答案 1 :(得分:5)
如果您不想为每个元素检查ignoreEven
,可以有条件地定义谓词本身:
.filter(ignoreEven ? (n -> n % 2 != 0) : (n -> true))
答案 2 :(得分:0)
您可以将条件传递到multiply(...)
方法并将其传递到filter
,如下所示。
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());
}
答案 3 :(得分:0)
您可以定义两个额外的辅助方法,并使用or()
方法组合它们:
private static Predicate<Integer> ignoringEven(boolean ignoreEven) {
return number -> !ignoreEven;
}
private static Predicate<Integer> ignoringOdd() {
return number -> (number % 2 != 0);
}
最终结果:
return input.stream()
.filter(ignoringEven(ignoreEven).or(ignoringOdd()))
.map(number -> number * 2)
.collect(Collectors.toList());
答案 4 :(得分:0)
您可以使用anyMatch方法:
return swiftTemplateList.stream()
.map(swiftTemplate -> swiftTemplate.getName())
.anyMatch(name -> name.equalsIgnoreCase(messageName));