什么时候在Java中使用Identity函数?

Jua*_*rez 1 java lambda functional-programming java-8

通过一些代码,并遇到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;
    }
Run Code Online (Sandbox Code Playgroud)

当打印带有和不带有映射的列表元素时,我得到相同的结果:

a
b
c
Run Code Online (Sandbox Code Playgroud)

那么,包含s-> s的目的是传递字符串并检索字符串吗?Function.identity()的目的是什么?

请给我提供一个更好的示例,也许这个示例对证明使用identity()的重要性没有意义。

谢谢

JB *_*zet 6

当API 强制您传递函数时,此功能很有用,但您想要保留的只是原始值。

例如,假设您有一个Stream<Country>,并且想要将其转换为Map<String, Country>。你会用

stream.collect(Collectors.toMap(Country::getIsoCode, Function.identity()))
Run Code Online (Sandbox Code Playgroud)

Collectors.toMap()希望有一个函数可以将“国家/地区”变成地图的键,而另一个函数是将其变成地图的值。由于您想将国家本身存储为值,因此可以使用身份功能。