在 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 更有效的解决方案。每当使用供应商时,它都避免了额外的方法调用。