何时在 Java 中使用 Identity 函数? [复制]
Posted
技术标签:
【中文标题】何时在 Java 中使用 Identity 函数? [复制]【英文标题】:when to use Identity function in Java? [duplicate] 【发布时间】:2020-01-03 03:34:40 【问题描述】:已经通过一些代码并遇到了 Function.identity() 我发现它类似于 s->s。我不明白为什么以及何时应该使用 Function.identity()。
我试图通过一个例子来理解,但它并没有澄清我的问题:
public static void main(String[] args)
Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity())
//.map(str -> str) //it is the same as identity()
.forEach(System.out::println);
return;
打印带有和不带有映射的列表元素时,我得到相同的结果:
a
b
c
那么,包含传递字符串和检索字符串的 s-> s 的目的是什么? Function.identity() 的目的是什么?
请给我一个更好的例子,也许这个例子无法证明使用identity()的重要性。
谢谢
【问题讨论】:
相关:softwareengineering.stackexchange.com/q/256090/3965 @AndyTurner 不好的例子。无论您使用.map(a -> a)
还是.map(Function.identity())
,编译器在任何一种情况下都会推断出Function<String,String>
,因为它没有暗示要使用超类型。所以生成的流类型仍然是Stream<String>
。但是,它确实从分配中推断出collect
操作的目标列表大小。在这两种情况下都有效。您可以映射到具有显式类型的Stream<Object>
,例如.<Object>map(Function.identity())
或.<Object>map(s -> s)
,这两种情况都适用。但是Function.identity()
不适用于mapToInt(i -> i)
...
【参考方案1】:
当 API 强制你传递一个函数时很有用,但你只想保持原始值。
例如,假设您有一个Stream<Country>
,并且您想将其转换为Map<String, Country>
。你会使用
stream.collect(Collectors.toMap(Country::getIsoCode, Function.identity()))
Collectors.toMap()
期望一个函数将 Country 转换为地图的键,而另一个函数将其转换为地图的值。由于您想将国家/地区本身存储为值,因此您使用身份功能。
【讨论】:
以上是关于何时在 Java 中使用 Identity 函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们需要复制构造函数以及何时应该在 java 中使用复制构造函数