如何根据布尔值将过滤器添加到流中?
例如 variable = false(我不添加过滤器),如果 variable = true 我添加它
list.stream()
.filter(I want do add or not add this filter depending on boolean variable)
.map(mapping method).collect(Collectors.toList)
答案 0 :(得分:2)
我能想到两种方法来做到这一点。
我认为最简单的就是检查条件并相应地写出函数式编程结构。
if (var) list.stream().filter().map().collect(Collectors.toList)
else list.stream().map().collect(Collectors.toList)
否则,请在过滤器本身中进行条件检查。在过滤器中,如果变量为真,我们总是返回真,从而使过滤器的行为无效,如果变量为假,则我们执行实际的过滤器逻辑。
list.stream().filter(()=>{
if (!var) return true;
else doFilter();
}).map().collect(Collectors.toList)
答案 1 :(得分:1)
Stream.filter
是一个中间操作。这意味着它返回另一个 Stream
实例,因此您可以使用常见的老式局部变量:
Stream<Whatever> s = list.stream();
if (variable) {
s = s.filter(x -> /* some condition to filter elements */);
}
List<SomethingElse> result = s.map(x -> /* map whatever to something else */)
.collect(Collectors.toList());
答案 2 :(得分:0)
这是我将如何做到这一点。您创建了一个返回 Predicate 的函数。根据您的参数,它要么应用您传入的函数,要么创建一个无操作谓词(即始终评估为真的谓词):
public <T> Predicate<T> createPredicate(boolean shouldApply, Function<T, Boolean> fun) {
return (t) -> shouldApply ? fun.apply(t) : true;
}
这里有一些测试来展示您将如何使用这样的东西:
private static final List<Integer> sampleList = List.of(1, 2, 3, 4, 5, 6);
@Test
public void shouldNotApplyFilter() {
List<Integer> result = sampleList
.stream()
.filter(createPredicate(false, i -> i % 2 == 0))
.map(i -> i * 2)
.collect(Collectors.toList());
Assertions.assertEquals(6, result.size());
}
@Test
public void shouldApplyFilter() {
List<Integer> result = sampleList
.stream()
.filter(createPredicate(true, i -> i % 2 == 0))
.map(i -> i * 2)
.collect(Collectors.toList());
Assertions.assertEquals(3, result.size());
}