关于lambda语法

时间:2014-03-31 11:20:36

标签: java lambda java-8

我正在检查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 -> tt -> { return t; }的快捷方式吗?

1 个答案:

答案 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以获取更多信息。