当前位置: 首页 > 知识库问答 >
问题:

Java 8 lambdas、function.identity()或t->t

许俊晤
2023-03-14

我有一个关于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(反之亦然)。我认为第二种选择更易读(当然是品味问题)。但是,有没有“真正”的理由让一个人优先呢?

共有1个答案

曾嘉祯
2023-03-14

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

原因是编译器生成一个包含lambda表达式的普通体的合成方法(在x->x的情况下,相当于返回标识符;),并告诉运行库创建调用此方法的函数接口的实现。因此,运行时只看到不同的目标方法,而当前的实现没有分析这些方法以确定某些方法是否等价。

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

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

 类似资料:
  • 问题内容: 我对方法的使用有疑问。 想象以下代码: 有任何理由为什么你应该使用而不是(反之亦然)。我认为第二个选项更具可读性(当然是个人喜好了)。但是,有没有“真正的”理由为什么应该优先考虑呢? 问题答案: 从当前的JRE实现开始,将始终返回相同的实例,而每次出现不仅会创建自己的实例,甚至还会具有不同的实现类。有关更多详细信息,请参见此处。 原因是编译器生成了一个合成方法,该方法保留了该表达式的琐

  • 下面是代码的味道:https://scastie.scala-lang.org/bQMGrAKgRoOFaK1lwCy04g 我有两个JSON APIendpoint。首先是项目。cgi以以下格式返回项目对象列表 表示项目没有借款人。 其次,用户。cgi,返回查询参数id指定的用户 API可能不好,但我必须处理它。现在在Scala中,我想使用这个漂亮的数据模型 我还有以下用于执行HTTP请求的方法

  • \t

    描述 (Description) 字符\t匹配制表符。 例子 (Example) 以下示例显示了字符匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CharactersDemo { private static final St

  • 我只是想说清楚,我的意思是这样的- 另外,如果我访问第一个数组以外的元素,也会遇到同样的问题,即(INT*)arr+13。它会属于越界访问的条款吗?因为我是在第一个数组的边界之外访问的。

  • 描述 (Description) 如果存在这样的注释,则java.lang.reflect.Method.getAnnotation(Class《T》 annotationClass)方法返回指定类型的此元素的注释,否则为null。 声明 (Declaration) 以下是java.lang.reflect.Method.getAnnotation(Class《T》 annotationClass

  • 描述 (Description) 如果存在这样的注释,则java.lang.reflect.Field.getAnnotation(Class《T》 annotationClass)方法返回指定类型的此元素的注释,否则为null。 声明 (Declaration) 以下是java.lang.reflect.Field.getAnnotation(Class《T》 annotationClass)方