Function.identity()
的原始实现如下:
static <T> Function<T> identity() {
return t -> t;
}
现在我的问题是为什么作者没有这样做:
static <T extends R, R> Function<T, R> identity() {
return t -> t;
}
有什么具体原因吗?或者只是因为方法名称(identity
)?或者他们根本就没有做到这一点?
答案 0 :(得分:4)
使用此附加类型参数,您将为此函数添加另一个用例;它不仅可以作为身份功能,还可以作为扩展转换功能。
但通常情况下,你不需要这个。主要目的是将此预定义函数作为参数传递,其中参数强制Function
。如果特定API遵循PECS规则,即使您想要进行扩展转换,身份函数也已经很好用,例如。
Optional<String> o = Optional.of("text");
Optional<CharSequence> cs = o.map(Function.identity());
List<String> l = Arrays.asList("foo", "bar", "baz");
Map<Serializable, List<String>> map1
= l.stream().collect(Collectors.groupingBy(Function.identity()));
与现有定义配合良好。
另一方面,当需要显式类型时,有两个类型参数会使用法变得复杂,因此,您不能只写Function.<String>identity()
但必须写入
Function.<String,String>identity()
这不仅更加冗长,而且对于身份函数来说真的很奇怪。