Did*_*r L 15 java functional-programming predicate java-8
我经常发现自己需要过滤Stream
或使用谓词来检查给定字段是否具有给定值.
比方说我有这个POJO:
public class A {
private Integer field;
public A(final Integer field) {
this.field = field;
}
public Integer getField() {
return field;
}
}
Run Code Online (Sandbox Code Playgroud)
我想Stream
根据以下值来过滤一个对象field
:
final Integer someValue = 42;
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(a -> Objects.equals(a.getField(), someValue))
...
Run Code Online (Sandbox Code Playgroud)
是否有方便的方法来生成方法的谓词filter
?我注意到Predicate.isEqual
它有但不适合需要.
我可以很容易地写一个这样的:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return v -> Objects.equals(value, f.apply(v));
}
Run Code Online (Sandbox Code Playgroud)
并将其用作:
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(isEqual(A::getField, someValue))
...
Run Code Online (Sandbox Code Playgroud)
但如果可能的话,我更愿意重用JDK中现有的方法.
Hol*_*ger 11
没有这样的内置工厂方法,您可以通过查看JFC中的所有用法Predicate
轻松检查并查找"返回谓词的方法".除了Predicate
本身的方法之外,只有Pattern.asPredicate()
哪一个返回a Predicate
.
在你要实施这种工厂方法之前,你应该问问自己这是否真的值得.是什么让你的lambda表达.filter(a -> Objects.equals(a.getField(), someValue))
看起来很复杂,Objects.equals
当你可以预测至少一个参数是否正确时,使用它是不必要的null
.从这里开始,someValue
永远不会null
,你可以简化表达式:
final Integer someValue = 42;
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(a -> someValue.equals(a.getField()))
…
Run Code Online (Sandbox Code Playgroud)
如果您仍想实施工厂方法并为创造性地使用已有的方法赢得价格,您可以使用:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return f.andThen(Predicate.isEqual(value)::test)::apply;
}
Run Code Online (Sandbox Code Playgroud)
但是,对于生产代码,我宁愿推荐这样的实现:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return value==null? t -> f.apply(t)==null: t -> value.equals(f.apply(t));
}
Run Code Online (Sandbox Code Playgroud)
这会影响测试常量是否null
简化将在每次测试中执行的操作.所以它仍然不需要Objects.equals
.请注意,Predicate.isEqual
确实类似.
归档时间: |
|
查看次数: |
6052 次 |
最近记录: |