在Java中何时使用标识函数?

在Java中何时使用标识函数?,java,lambda,java-8,functional-programming,Java,Lambda,Java 8,Functional Programming,已经通过一些代码并运行到函数.identity(),我发现它类似于s->s。我不明白为什么以及何时应该使用Function.identity() 我试图通过一个例子来理解,但它并没有澄清我的问题: public static void main(String[] args){ Arrays.asList("a", "b", "c") .stream() .map(Function.identity()) //.map(s

已经通过一些代码并运行到函数.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()的重要性

谢谢

当API强制您传递函数时,它很有用,但您只想保持原始值

例如,假设您有一个
,并且希望将其转换为
映射
。你会用

stream.collect(Collectors.toMap(Country::getIsoCode, Function.identity()))
Collectors.toMap()
需要一个函数将国家变成地图的一个键,另一个函数将国家变成地图的一个值。由于您希望将国家本身存储为值,因此可以使用identity函数。

当API强制您传递函数时,它很有用,但您只需要保留原始值

例如,假设您有一个
,并且希望将其转换为
映射
。你会用

stream.collect(Collectors.toMap(Country::getIsoCode, Function.identity()))

Collectors.toMap()
需要一个函数将国家变成地图的一个键,另一个函数将国家变成地图的一个值。由于您希望将国家本身存储为值,因此可以使用identity函数。

Related:@AndyTurner坏例子。无论您使用
.map(a->a)
还是
.map(Function.identity())
,编译器都会在这两种情况下推断出
函数
,因为它没有暗示要使用超类型。因此,生成的流类型仍然是
stream
。但是,它确实可以从分配中推断
collect
操作的目标列表大小。这两种情况都适用。您可以使用显式类型映射到
,如
.map(Function.identity())
.map(s->s)
,这两种情况下都同样有效。但是
Function.identity()
不适用于
mapToInt(i->i)
…Related:@AndyTurner坏例子。无论您使用
.map(a->a)
还是
.map(Function.identity())
,编译器都会在这两种情况下推断出
函数
,因为它没有暗示要使用超类型。因此,生成的流类型仍然是
stream
。但是,它确实可以从分配中推断
collect
操作的目标列表大小。这两种情况都适用。您可以使用显式类型映射到
,如
.map(Function.identity())
.map(s->s)
,这两种情况下都同样有效。但是
Function.identity()
不适用于
mapToInt(i->i)