我正在检查JDK 8 API并在Function
接口内部注意到身份功能
static <T> Function<T, T> identity() {
return t -> t;
}
这解析为方法:
R apply(T t);
在同一Function
接口中声明。
问题是t -> t
部分有效的原因。
如果我们根据熟悉的 Anonymous Inner Class
扩展此表达式new Function<String, String>() {
@Override
String apply(String t) {
t; // Oops, compilation error
}
}
t -> t
是t -> { return t; }
的快捷方式吗?
答案 0 :(得分:5)
问题是
t -> t
部分有效的原因。
因为lambda表达式可以返回它作为参数使用的值。 return
隐含在lambda表达式的目标类型的右侧部分中。表达式基本上与:
t -> { return t; }
这意味着对于具有t -> t
返回类型的方法的函数接口,void
将失败,如下例所示:
Consumer<String> consumer = t -> t;
lambda的目标类型有Consumer<T>
,其中包含方法 - void accept(T t)
。由于该方法具有void
返回类型,因此上述分配失败。
您可以浏览State of the Lambda以获取更多信息。