我有一个关于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
不仅会创建自己的实例,甚至会有一个不同的实现类。更多详情请参阅此处。
原因是编译器生成一个包含lambda表达式的普通体的合成方法(在x->x
的情况下,相当于返回标识符;
),并告诉运行库创建调用此方法的函数接口的实现。因此,运行时只看到不同的目标方法,而当前的实现没有分析这些方法以确定某些方法是否等价。
因此,使用function.identity()
而不是x->x
可能会节省一些内存,但如果您真的认为x->x
比function.identity()
更易读,那么这不应该促使您做出决定。
您还可以考虑在启用调试信息的情况下进行编译时,合成方法将有一个line debug属性指向保存lambda表达式的源代码行,因此您有机会在调试时找到特定function
实例的源代码。相比之下,在调试操作期间遇到function.identity()
返回的实例时,您将不知道是谁调用了那个方法并将实例传递给了操作。
问题内容: 我对方法的使用有疑问。 想象以下代码: 有任何理由为什么你应该使用而不是(反之亦然)。我认为第二个选项更具可读性(当然是个人喜好了)。但是,有没有“真正的”理由为什么应该优先考虑呢? 问题答案: 从当前的JRE实现开始,将始终返回相同的实例,而每次出现不仅会创建自己的实例,甚至还会具有不同的实现类。有关更多详细信息,请参见此处。 原因是编译器生成了一个合成方法,该方法保留了该表达式的琐
下面是代码的味道:https://scastie.scala-lang.org/bQMGrAKgRoOFaK1lwCy04g 我有两个JSON APIendpoint。首先是项目。cgi以以下格式返回项目对象列表 表示项目没有借款人。 其次,用户。cgi,返回查询参数id指定的用户 API可能不好,但我必须处理它。现在在Scala中,我想使用这个漂亮的数据模型 我还有以下用于执行HTTP请求的方法
描述 (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)方