如何(动态地)改变 Java 流的过滤条件?

How to (dynamically) change Java stream's filter conditions?

我有几个 类 以下一般形式,其中 this.words 是一个 List<String>,每个元素包含一个词:

public ArrayList<String> wordsInclZ() {
    ArrayList<String> results = new ArrayList<>();

    this.words.stream()
        .filter(word -> word.contains("z"))
        .forEach(word -> results.add(word));

    return results;
}

我唯一需要更改的是过滤条件,即 .filter() 中的表达式。这似乎不是一个糟糕的复制粘贴情况,但我想了解是否可以编写更整洁的代码。

是否有一种简洁的方法来概括此功能?我想我基本上是在问我是否可以以及如何将 lambda 作为处理上述方法其余功能的通用方法的参数传递给 .filter()

您可以为您的函数创建一个参数:

Predicate<String> predicate

然后您可以将过滤器传递给您的函数:

wordsInclZ(word -> word.contains("z"));

过滤器将是:

filter(predicate);

您可以创建一个函数并将其作为参数传递给过滤器:

public ArrayList<String> wordsInclZ() {
    ArrayList<String> results = new ArrayList<>();

    this.words.stream()
         .filter(MyClass::myFilterFunction)
         .forEach(word -> results.add(word));

     return results;
}

private static boolean myFilterFunction(String word){
    // do whatever you need and return TRUE or FALSE
}

这里有两个选项:

  1. 将方法引用传递给采用实际值和 returns boolean 结果的方法:

    public boolean filter1(String s) {
        return s.contains("z");
    }
    // .filter(this::filter1)  
    
  2. 从方法返回 Predicate

    public Predicate<String> filter2() {
        return s -> s.contains("z");
    }
    // .filter(filter2())