gpt4 book ai didi

java - 是否有一种方便的方法来创建一个测试字段是否等于给定值的谓词?

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:46 24 4
gpt4 key购买 nike

我经常发现自己需要过滤 Stream 或使用谓词来检查给定字段是否具有给定值。

比如说我有这个 POJO:

public class A {
private Integer field;

public A(final Integer field) {
this.field = field;
}

public Integer getField() {
return field;
}
}

我想根据字段的值过滤对象的Stream:

    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))
...

是否有一种方便的方法来为 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));
}

并将其用作:

    Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(isEqual(A::getField, someValue))
...

但如果可能,我更愿意重用 JDK 中的现有方法。

最佳答案

没有这样的内置工厂方法,您可以通过查看 all usages of Predicate within the JFC 轻松检查。并寻找“Methods in … that return Predicate”。除了 Predicate 中的方法本身,只有 Pattern.asPredicate()它返回一个 Predicate

在你打算实现这样一个工厂方法之前,你应该问问自己它是否真的值得。是什么让 .filter(a -> Objects.equals(a.getField(), someValue)) 中的 lambda 表达式看起来很复杂,是 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()))

如果您仍然想实现工厂方法并通过创造性地使用已有的东西来赢得价格,您可以使用:

public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return f.andThen(Predicate.isEqual(value)::test)::apply;
}

但是,对于生产代码,我宁愿推荐这样的实现:

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));
}

这将测试常量是否为 null 以简化将在每个测试中执行的操作。所以它仍然不需要 Objects.equals。请注意,Predicate.isEqual 的作用与此类似。

关于java - 是否有一种方便的方法来创建一个测试字段是否等于给定值的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33300011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com