Java Lambda表达式还是方法引用?

Java Lambda表达式还是方法引用?,java,lambda,java-8,Java,Lambda,Java 8,我在一本书(Fischer的Java闭包和Lambda,Apress 2015)中读到,方法引用比Lambda表达式更可取。在我看来,lambda表达式对于使用其他语言的开发人员来说更容易理解。那为什么说方法参考更可取呢?在Java 8中编写lambda表达式是一种糟糕的做法吗?在第2章的lambda最佳实践部分,Fischer的书中说: 尽可能使用方法引用而不是lambda。方法引用不仅更短、更易于阅读,而且使用方法引用将使您直接将方法作为值来考虑。这是您需要从代码库和大脑中删除的代码: 如果

我在一本书(Fischer的Java闭包和Lambda,Apress 2015)中读到,方法引用比Lambda表达式更可取。在我看来,lambda表达式对于使用其他语言的开发人员来说更容易理解。那为什么说方法参考更可取呢?在Java 8中编写lambda表达式是一种糟糕的做法吗?

在第2章的lambda最佳实践部分,Fischer的书中说:

尽可能使用方法引用而不是lambda。方法引用不仅更短、更易于阅读,而且使用方法引用将使您直接将方法作为值来考虑。这是您需要从代码库和大脑中删除的代码:

如果您很自然地编写了这些代码,那么您仍然没有在函数式编程的更高层次上进行思考。一旦你实现了这一飞跃,沟通和处理复杂函数就会变得容易得多,因为你将以类型而不是价值观来思考

虽然我基本上同意这个结论,但我不确定我是否相信费舍尔的推理。方法引用通常(尽管不总是)比写出的lambda短。在第一部分中,他说方法引用将帮助您将方法视为值。好的,但后来他说事情会变得更容易,因为你会用类型而不是价值来思考。我不知道那是什么意思

有可能重写他给出的示例表达式

    it::do
这当然比原来的要短,但很难从一个小例子中概括出来

下面是我对方法引用和写出来的lambdas的看法

如果可以在使用lambda表达式和方法引用之间进行选择,通常情况下,方法引用更可取。但这不是一条硬性规定,在某些情况下,lambda表达式可能更可取。这在某种程度上也是一个品味的问题

如果您熟悉其他语言中的lambda表达式,那么Java中的lambda表达式可能比方法引用更为熟悉。然而,我相信在您学习方法引用之前,这只是一种暂时状态。一旦他们更熟悉了,方法引用的优点可能会超过最初的不熟悉

考虑以下获取字符串长度的简单示例:

List<String> list = ... ;
int[] lengths1 = list.stream().mapToInt(s -> s.length()).toArray();
int[] lengths2 = list.stream().mapToInt(String::length).toArray();
这是字符串串联还是数字加法?如果是数字,是什么类型?根据语言规则,这必须在编译时知道,否则就是错误。虽然编译器可能很清楚,但有时读者并不十分清楚。而是考虑这些方法参考文献:

String::concat
Integer::sum
Double::sum

在这种情况下,为操作使用名称可以让读者非常清楚地了解操作的意图。

这不是一种“坏习惯”,它只是意味着它不可重用,不能自我引用(递归)。Downvoter-请发表评论!那是哪本书?作者是罗伯特·菲舍尔吗?是的,作者是罗伯特·菲舍尔。我们发现:当人们第一次学习lambdas和method refs时,他们倾向于觉得method refs“看起来很奇怪”,并避开它们。然后他们和他们一起编程一段时间,突然他们的偏好“捕捉”到了费舍尔提供的指导——很可能是因为他们已经克服了“看起来很奇怪”的反应,并且可以看到它是什么。Fisher的结论与我们在语言中添加该功能时的意图一致(尽管总是有例外)。我认为您只是停留在第一阶段——所以请在六个月后回来回答您自己的问题。。。
(x, y) -> x + y
String::concat
Integer::sum
Double::sum