首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java8lambdas、Function.identity()或t->t

Java8lambdas、Function.identity()或t->t
EN

Stack Overflow用户
提问于 2015-01-20 04:15:59
回答 3查看 165.4K关注 0票数 308

我有一个关于Function.identity()方法用法的问题。

想象一下下面的代码:

代码语言:javascript
复制
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 (反之亦然)?我认为第二种选择更具可读性(当然是品味问题)。但是,有没有什么“真正”的理由应该优先选择一个呢?

EN

回答 3

Stack Overflow用户

发布于 2015-01-20 17:13:47

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

原因是编译器生成了一个合成方法,该方法保存了lambda表达式的简单主体(对于x->x,相当于return identifier;),并告诉运行时创建调用此方法的函数接口的实现。因此,运行库只看到不同的目标方法,并且当前实现不会分析这些方法来确定某些方法是否等效。

因此,使用Function.identity()而不是x -> x可能会节省一些内存,但如果您真的认为x -> xFunction.identity()更具可读性,那么这不应该促使您做出决定。

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

票数 383
EN

Stack Overflow用户

发布于 2015-01-20 04:29:45

在您的示例中,str -> strFunction.identity()之间没有太大区别,因为在内部它只是t->t

但有时我们不能使用Function.identity,因为我们不能使用Function。看看这里:

代码语言:javascript
复制
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);

这将编译得很好。

代码语言:javascript
复制
int[] arrayOK = list.stream().mapToInt(i -> i).toArray();

但是如果你尝试编译

代码语言:javascript
复制
int[] arrayProblem = list.stream().mapToInt(Function.identity()).toArray();

你会得到编译错误,因为mapToInt需要与Function无关的ToIntFunction。此外,ToIntFunction没有identity()方法。

票数 110
EN

Stack Overflow用户

发布于 2015-01-20 04:41:51

JDK source

代码语言:javascript
复制
static <T> Function<T, T> identity() {
    return t -> t;
}

所以,不,只要它在语法上是正确的。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28032827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档