【问题标题】:Why different predicate interfaces n JAVA 8?为什么不同的谓词接口n JAVA 8?
【发布时间】:2016-06-14 13:19:20
【问题描述】:

在 Java 8 中提供了不同的谓词接口(例如 DoublePredicate、LongPredicate、IntPredicate 等)。现在,如果您要实现接口并在其中编写自己的代码,那么拥有不同的谓词接口有什么好处?为什么不只有一个谓词接口?

【问题讨论】:

  • 一个更有趣的问题是做一些原始类型而不是其他类型。 ;)
  • @PeterLawrey 实际上为什么不是 BooleanStream,CharStream .... ? Brian 说一些地方它会增加很少使用的 API 的 JDK 占用空间。
  • @SleimanJneidi 虽然这可能是原因,但我不认为从未使用过的压缩类文件会增加那么多的占用空间。

标签: java interface predicate functional-interface


【解决方案1】:

出于性能原因,存在这些不同的接口。

因为generics 不允许原始类型(到目前为止)并且它们需要装箱,所以 API 为原始类型提供了专门化,因此您可以避免装箱和拆箱的成本。

【讨论】:

    【解决方案2】:

    这些专用谓词接口的重点是在使用原语时避免不必要的auto-(un)boxing

    例如,如果您需要使用适用于int 值的Predicate,您可以使用IntPredicate,您可以将int 直接传递给test(...) 方法,而不是@987654327 @ 需要装箱到 Integer 对象。

    请注意,在 Java 中,不能使用原始类型作为类型参数(因此,Predicate<int> 是不允许的)。

    【讨论】:

      【解决方案3】:

      不仅有Predicates,还有其他具有特定类型变体的功能接口。原因是,支持 primitive 类型。

      虽然通用版本可以与 object 类型(包括DoubleLong 等)一起使用,但无法将原语与泛型一起使用。即

      Predicate<int> p; //does not compile
      

      例如,IntStreamint 上运行,而不是在 Integer 上运行,但您不能在 int 值上使用对象类型的功能接口,因此您需要功能接口的特定于 int 的变体.

      【讨论】:

        【解决方案4】:

        提供这些专门的谓词接口以支持原始数据类型,如 int 或 float,无需自动装箱。如果没有它们,我们必须将我们的 int 数据转换为 Integer Object 以在 Predicate 接口中使用。

        http://codedestine.com/java-8-predicate-interface/

        【讨论】:

        • 只是一个小的修正:float 数据类型没有专门的功能接口。恕我直言,intlongdouble 的包装器可用,但仅此而已。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多