我有以下一般表格的几个类,其中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()
作为处理上述方法功能的其他方法的一般方法的参数。
答案 0 :(得分:3)
您可以为您的函数创建一个参数:
Predicate<String> predicate
然后您可以将过滤器传递给您的函数:
wordsInclZ(word -> word.contains("z"));
过滤器将是:
filter(predicate);
答案 1 :(得分:2)
这里有两个选项:
将方法引用传递给采用实际值并返回boolean
结果的方法:
public boolean filter1(String s) {
return s.contains("z");
}
// .filter(this::filter1)
从方法中返回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
}