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

时间:2017-03-08 08:24:25

标签: java lambda java-8 java-stream predicate

我有以下一般表格的几个类,其中this.wordsList<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()作为处理上述方法功能的其他方法的一般方法的参数。

3 个答案:

答案 0 :(得分:3)

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

Predicate<String> predicate

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

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

过滤器将是:

filter(predicate);

答案 1 :(得分:2)

这里有两个选项:

  1. 将方法引用传递给采用实际值并返回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())
    

答案 2 :(得分:1)

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

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
}