【问题标题】:Why we need Predicate functional interface in Java?为什么我们需要 Java 中的 Predicate 函数式接口?
【发布时间】:2017-06-13 13:38:29
【问题描述】:

为什么我们需要 Predicate 接口?我不明白下面的代码。我怎样才能找到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();

【问题讨论】:

  • 你觉得这个Predicate在做什么?
  • 这是guava谓词顺便说一句,不是jdk
  • @Eugene 两个接口的目的相同。
  • @Flown 我知道...
  • 谓词告诉你条件是真还是假。如果您以功能方式过滤集合,这听起来很方便。

标签: java java-8 predicate functional-interface


【解决方案1】:

Predicates 非常适合将整个函数抽象为它们产生的任何类型的结果,从而提高可读性和可重用性。 Guava 和 Java 版本的接口都是如此。 Predicates 的名字应该很好,所以在这个例子中有点难以理解发生了什么。

我不知道TravellerTypePassengerCode 是什么,但为了争论,我们将Predicate 重命名为它的任何名称。

然后我们可以将我们的可迭代语句编码为:

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 做了什么,那么这段代码就变得比注入匿名类甚至 lambda 作为参数更具可读性。

【讨论】:

    【解决方案2】:

    Iterables.tryFind 将返回给定列表 (result.getTravellerTypes()) 中的第一个值,该值满足参数给定的谓词。

    因此,对于您的每个 travellerTypes,它将运行 apply 方法。第一个将返回true 将由tryFind 方法返回。

    .orNull() 表示,如果列表中没有对象满足谓词方法,则返回 null 而不是可选的。

    【讨论】:

      【解决方案3】:

      谓词允许在过滤期间设置条件。

      你的条件是:

      PassengerCodeUtil.paxCodesEqual(input.getTravellerType().getCode(), "CHD");
      

      这意味着您要查找result.getTravellerTypes() 中包含的第一个TravellerType 实例,其中code 的值等于CHD 字符串。

      如果没有过滤预期元素的谓词用法,使用tryFind() 有哪些兴趣?
      你可以得到result.getTravellerTypes()中的任何元素。

      【讨论】:

        【解决方案4】:

        在 Java 8 中,Predicate 是一个函数式接口,可用作 lambda 表达式或方法引用的赋值目标。那么,您认为我们可以在日常编程中使用这些返回真/假的函数吗?我会说你可以在任何需要评估类似对象的组/集合的条件的地方使用谓词,以便评估可以导致真或假。

        例如,您可以在这些实时用例中使用谓词

        1. 查找在特定日期之后出生的所有孩子
        2. 超过一定年龄的员工等等..

        【讨论】:

          猜你喜欢
          • 2011-04-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-23
          • 1970-01-01
          • 2010-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多