关于lambda语法

sev*_*een 2 java lambda java-8

我正在检查JDK 8 API和内部Function接口我注意到身份功能

static <T> Function<T, T> identity() {
    return t -> t;
}
Run Code Online (Sandbox Code Playgroud)

这解决方法:

R apply(T t);
Run Code Online (Sandbox Code Playgroud)

在同一个Function界面声明.

问题是t -> t部分有效的原因.

如果我们根据熟悉的匿名内部类扩展这个表达式

new Function<String, String>() {

    @Override
    String apply(String t) {
         t; // Oops, compilation error
    }
}
Run Code Online (Sandbox Code Playgroud)

t -> t一种捷径t -> { return t; }吗?

Roh*_*ain 5

问题是t -> t部分有效的原因.

因为lambda表达式可以返回它作为参数所采用的值.的return在右边部分从lambda表达式的目标类型暗示.表达式基本相同:

t -> { return t; }
Run Code Online (Sandbox Code Playgroud)

这意味着t -> t对于具有void返回类型的方法的功能接口将失败,如下例所示:

Consumer<String> consumer = t -> t;
Run Code Online (Sandbox Code Playgroud)

那里有lambda的目标类型Consumer<T>,它有方法 - void accept(T t)在其中.由于该方法具有void返回类型,因此上述分配失败.

您可以通过Lambda状态获得更多信息.