在 Java 8 为什么我们不能使用方法引用将 Math.random() 转换为 Math::random
In Java 8 why we cannot convert Math.random() to Math::random using method references
这个有效
Supplier<Double> random1 = () -> Math.random();
为什么这不起作用:
Supplier<Double> random2 = () -> Math::random
仅使用方法引用即可,例如:
Supplier<Double> random2 = Math::random
因为它已经代表 Supplier<Double>
。
另一方面,您当前使用的符号表示 Supplier<Double>
的 Supplier
,例如:
Supplier<Supplier<Double>> random2 = () -> Math::random;
Why this doesn't work?
Supplier<Double> random2 = () -> Math::random
因为类型 Supplier<Double>
需要 returns 一个数字的函数,但是 lambda returns 一个函数(在本例中是一个方法引用)而不是一个数字。
正如 Naman 指出的那样,这会起作用:
Supplier<Double> random2 = Math::random
请注意,此版本中没有 lambda。我们正在将方法引用分配给 random2
,而不是(在调用时)returns 方法引用的 lambda。
这实际上是一个比调用 random
方法的 lambda 更有效的解决方案。每当使用供应商时,它都避免了额外的方法调用。
这个有效
Supplier<Double> random1 = () -> Math.random();
为什么这不起作用:
Supplier<Double> random2 = () -> Math::random
仅使用方法引用即可,例如:
Supplier<Double> random2 = Math::random
因为它已经代表 Supplier<Double>
。
另一方面,您当前使用的符号表示 Supplier<Double>
的 Supplier
,例如:
Supplier<Supplier<Double>> random2 = () -> Math::random;
Why this doesn't work?
Supplier<Double> random2 = () -> Math::random
因为类型 Supplier<Double>
需要 returns 一个数字的函数,但是 lambda returns 一个函数(在本例中是一个方法引用)而不是一个数字。
正如 Naman 指出的那样,这会起作用:
Supplier<Double> random2 = Math::random
请注意,此版本中没有 lambda。我们正在将方法引用分配给 random2
,而不是(在调用时)returns 方法引用的 lambda。
这实际上是一个比调用 random
方法的 lambda 更有效的解决方案。每当使用供应商时,它都避免了额外的方法调用。