如果满足某些条件,则将过滤器应用于流

时间:2021-05-18 19:06:40

标签: java java-stream

如何根据布尔值将过滤器添加到流中?

例如 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)

3 个答案:

答案 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());
}