如何(动态地)改变 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
}
这里有两个选项:
将方法引用传递给采用实际值和 returns 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())
我有几个 类 以下一般形式,其中 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
}
这里有两个选项:
将方法引用传递给采用实际值和 returns
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())