java - 为什么我们需要Java中的Predicate函数式接口(interface)?

标签 java java-8 predicate functional-interface

为什么我们需要 Predicate 接口(interface)?我不明白下面的代码。我怎样才能找到primaryPaxOutput的结果?

    Predicate<TravellerType> predicate1 = new Predicate<TravellerType>() {
        @Override
        public boolean apply(TravellerType input) {
            return PassengerCodeUtil.paxCodesEqual(input.getTravellerType().getCode(), "CHD");
        }
    };

    primaryPaxOutput = Iterables.tryFind(result.getTravellerTypes(), predicate1).orNull();

最佳答案

谓词非常适合将整个函数抽象为它们产生的任何类型的结果,这提高了可读性和可重用性。对于该界面的 Guava 和 Java 版本都是如此。 谓词应该有良好的命名,因此在这个例子中有点难以理解发生了什么。

我不知道 TravellerTypePassengerCode 是什么,但为了便于论证,让我们将 Predicate 重命名为它的作用。

然后我们可以将 iterables 语句编码为:

primaryPaxOutput = Iterables.tryFind(result.getTravellerTypes(), paxCodeIsCHD).orNull();

然后我们将此声明解释为:

Iterables.tryFind(            //Find the first instance
result.getTravellerTypes(),   //among this Iterable
paxCodeIsCHD                  //where this predicate is true
).orNull();                   //or else set to null.

如果您知道 tryFind 的作用,那么此代码将比注入(inject)匿名类甚至 lambda 作为参数更具可读性。

关于java - 为什么我们需要Java中的Predicate函数式接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44523215/

相关文章:

java - Java中的分布式计数信号量

macros - LISP 中宏的谓词是什么

java - 如何将谓词列表添加到 CriteriaBuilder.or

java - 程序运行后线程 "main"出现异常

java - 功率图算法

java - 为什么这个数组显示错误消息(Eclipse)

Java 8 Stream distinct 不起作用

java - 可重入 tryLock() 在多线程环境中不加锁

java - 如何在 Java 8 中将 LocalDateTime 转换为 Date

c++ - 为什么我不能用谓词的实例化构造 std::set,但我可以分配以这种方式构造的 std::set?