【问题标题】:why ToDoubleBiFunction doesn't extend BiFunction [duplicate]为什么 ToDoubleBiFunction 不扩展 BiFunction [重复]
【发布时间】:2018-09-27 20:13:45
【问题描述】:

我想知道为什么 ToDoubleBiFunction 不扩展 BiFunction。我就是这样做的:

import java.util.function.BiFunction;

public class Test {
  public static void main(String[] args) {
    MyToDoubleBiFunction<Integer, Integer> f = (a, b) -> a.doubleValue() + b.doubleValue();
    System.out.println(f.apply(1, 2));
  }
}

@FunctionalInterface
interface MyToDoubleBiFunction<T, U> extends BiFunction<T, U, Double> {
}

此代码有效并打印3.0

另外,使用罗嗦的applyAsDouble 方法而不是众所周知的apply 有什么意义?

【问题讨论】:

  • MyToDoubleBiFunction.apply 的结果类型为DoubleToDoubleBiFunction.applyAsDouble 的结果类型为double

标签: java


【解决方案1】:

BiFunction 的特定版本(例如ToDoubleBiFunction)的要点是避免auto(un)boxing - 在这种情况下,将原始double 值自动装箱/从java.lang.Double 对象拆箱。

如果ToDoubleBiFunction 会扩展BiFunction&lt;T, U, Double&gt;,那么您将拥有自动(取消)装箱。

请注意,您不能在 Java 中将原始类型用作类型参数,因此 BiFunction&lt;T, U, double&gt;(注意 double 是此处的原始类型)是不可能的。

【讨论】:

  • 不错、具体且有效的答案。 +1 来自我。我想知道的是(无需深入研究源代码)我们如何编写Function 而无需使用三个、四个或更多参数进行自动(取消)装箱?例如ToIntThreeFunction...
  • @zlakad 没有什么神奇的:你只需用一个方法定义一个接口,返回一个int:interface ToIntThreeFunction&lt;A, B, C&gt; { int apply3(A a, B b, C c); }
  • @AndyTurner,啊,好吧,我会尝试的。泰。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多