gpt4 book ai didi

Java 8 lambda、Function.identity() 或 t->t

转载 作者:IT老高 更新时间:2023-10-28 12:17:25 28 4
gpt4 key购买 nike

我对 Function.identity() 方法的使用有疑问。

想象一下下面的代码:

Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity()) // <- This,
.map(str -> str) // <- is the same as this.
.collect(Collectors.toMap(
Function.identity(), // <-- And this,
str -> str)); // <-- is the same as this.

你有什么理由应该使用 Function.identity() 而不是 str->str (反之亦然)。我认为第二个选项更具可读性(当然是口味问题)。但是,是否有任何“真正”的理由应该首选一个?

最佳答案

在当前的 JRE 实现中,Function.identity() 将始终返回相同的实例,而每次出现的 identifier -> identifier 不仅会创建自己的实例但甚至有一个独特的实现类。更多详情,请参阅 here .

原因是编译器生成了一个合成方法来保存该 lambda 表达式的平凡主体(在 x->x 的情况下,相当于 return identifier; ) 并告诉运行时创建调用此方法的功能接口(interface)的实现。所以运行时只看到不同的目标方法,当前的实现不会分析方法来找出某些方法是否等效。

所以使用 Function.identity() 而不是 x -> x 可能会节省一些内存,但如果你真的认为 x -> xFunction.identity() 更具可读性。

您还可以考虑,在启用调试信息的情况下进行编译时,合成方法将有一个 line debug 属性指向包含 lambda 表达式的源代码行,因此您有机会找到特定的源代码Function 实例同时调试。相比之下,在调试操作时遇到 Function.identity() 返回的实例,您将不知道是谁调用了该方法并将该实例传递给操作。

关于Java 8 lambda、Function.identity() 或 t->t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28032827/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com