java - 是否可以将方法引用与接口(interface)的静态方法一起使用?

标签 java lambda method-reference

这是我的第一个代码:

public class MethodReference {
    public static void main (String []args) {
        Stream<String> s = Stream.of("brown bear", "grizzly");
        s.sorted(Comparator.reverseOrder()).forEach(System.out::print);
        //...
    }
}

结果:灰棕熊

这是我的第二个代码:

public class MethodReference {
    public static void main (String []args) {
        Stream<String> s = Stream.of("brown bear", "grizzly");
        s.sorted(Comparator::reverseOrder()).forEach(System.out::print);
        //...
    }
}

结果:编译器错误

我的问题: 为什么第二段代码会出现编译错误? 函数式接口(interface)的静态方法不能使用方法引用吗?

我知道我不能将方法引用与功能接口(interface)的默认方法一起使用。 我知道我可以在 5 种情况下对类使用方法引用:

类别

  • 类::staticMethod

  • 类::instanceMethod

  • 实例::实例方法

  • 类::new

功能接口(interface)

  • 接口(interface)::abstractMethod

非常感谢!

最佳答案

Comparator.reverseOrder()是一个解析为 Comparator 的表达式类型,因为这就是它返回的内容。

Comparator::reverseOrder是一个解析为方法的表达式,该方法不带参数并返回 Comparator例如一个Supplier<Comparator<String>> ,尽管它可以是任何匹配的功能接口(interface)。

在第二个实例中,您尝试传递一个方法(提供 Comparator )作为参数。该方法不需要那样 - 它只想要 Comparator本身。

你可以这样想(只是用伪代码来演示这一点):

s.sorted(new Comparator())

对比

s.sorted(new Supplier(new Comparator()))
<小时/>

回答你的第二个问题,即是否可以对接口(interface)的静态方法使用方法引用 - 是的,绝对可以!

如果我们声明以下方法:

<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }

那么我们肯定可以通过方法引用来调用它

giveMeAComparatorSupplier(Comparator::reverseOrder);
<小时/>

(仅供引用,您的方法引用语法是错误的 - 它从不使用 () )

关于java - 是否可以将方法引用与接口(interface)的静态方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747731/

相关文章:

java - 对象的 getter 与基元的 getter 有什么不同吗?

python - 循环内部 lambda

java - 在这种情况下使用方法引用有什么好处?

java - Maven 在我们的系统中一定需要 Java 吗?

java - Eclipse 中以及运行 mvn clean install 时出现 Maven 错误

java - 遇到 OutOfMemoryException 时删除 List<> 的一部分

templates - 带有模板参数的 C++0x lambdas?

java - 迭代 HashMap 时引用局部变量 -> 从 lambda 表达式引用的局部变量必须是最终的或有效的最终错误

JavaFX方法引用事件处理

带有 instanceof 和 class cast 方法引用的 Java 流