为什么Java 8的Function.identity()的返回类型与其输入类型相同?

时间:2018-02-14 09:52:06

标签: java generics java-8

Function.identity()的原始实现如下:

static <T> Function<T> identity() {
    return t -> t;
}

现在我的问题是为什么作者没有这样做:

static <T extends R, R> Function<T, R> identity() {
    return t -> t;
}

有什么具体原因吗?或者只是因为方法名称(identity)?或者他们根本就没有做到这一点?

1 个答案:

答案 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()这不仅更加冗长,而且对于身份函数来说真的很奇怪。