在Java中何时使用标识函数?
已经通过一些代码并运行到函数.identity(),我发现它类似于s->s。我不明白为什么以及何时应该使用Function.identity() 我试图通过一个例子来理解,但它并没有澄清我的问题:在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
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)
…