Java 8方法引用与"实际"函数指针有何不同?

Avi*_*ohn 2 java lambda closures function-pointers java-8

有人告诉我tbat Java 8方法引用没有'true'函数指针那么强大.

怎么回事?方法引用与函数指针有何不同?

Pet*_*rey 8

什么是currying?

Currying是从现有方法和参数构造新方法引用的能力.例如

// this is curried and implied in this method.
BiFunction<String, Integer> m = this::methodTwo;

// create a new curried method.
Function<String> m10 = t -> m.apply(t, 10);
Run Code Online (Sandbox Code Playgroud)

一个真实的例子是消费者

// curry this method so that when called it prints to System.out
Consumer<String> out = System.out::println;
Run Code Online (Sandbox Code Playgroud)

Java 8方法引用没有'true'函数指针那么强大.

Java 8方法引用实际上是对封装虚方法的对象的引用.这在某种程度上非常有效,但是你可能期望的一些基本的东西是做不到的.例如equals(),toString(),表达式检查不会做你所期望的.

方法引用与函数指针有何不同?

函数指针纯粹是对函数的引用.Java中的方法参考包括currying信息,例如,这是一种具有X,Y,Z作为已知参数的方法.

Java 8是否支持真正的闭包?

Java在功能方面往往极简主义,但您可以将其视为给定,而Java中的任何功能都不是"纯粹的".它有太多的向后兼容性问题需要处理,即使有纯粹的意愿,它也不可能.

我们还需要在能够在lambda中使用它之前声明变量final吗?

不,"有效最终"已经足够了.也就是说,如果你可以让它成为最终的,那就没关系.