何时在 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 中使用复制构造函数

Java - 何时使用'this'关键字[重复]

何时在Java中使用单方法接口

何时在 clojure(或 lisp)中使用感叹号?

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?

java 对象在构造过程中何时变为非空?