如果可以跳过,为什么我应该对 lambda 参数使用局部变量类型推断?

Ada*_*dam 0 java lambda type-inference java-11

Java 11 引入了 lambda 参数的局部变量类型推断。例如:

Stream.of("a", "b", "c").map((var a) -> "ok")
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我可以跳过它,为什么要使用它。例如:

Stream.of("a", "b", "c").map(a -> "ok")
Run Code Online (Sandbox Code Playgroud)

Tho*_*ger 6

JEP 323规定了以下目标:

  • 将隐式类型 lambda 表达式中的形式参数声明的语法与局部变量声明的语法对齐。

它指出了动机:

lambda 表达式可以是隐式类型的,其中所有形式参数的类型都会被推断出来:

    (x, y) -> x.process(y)    // implicitly typed lambda expression
Run Code Online (Sandbox Code Playgroud)

Java SE 10 使局部变量可以使用隐式类型:

    var x = new Foo();
    for (var x : xs) { ... }
    try (var x = ...) { ... } catch ...
Run Code Online (Sandbox Code Playgroud)

为了与局部变量保持一致,我们希望允许使用“var”作为隐式类型 lambda 表达式的形式参数:

    (var x, var y) -> x.process(y)   // implicit typed lambda expression
Run Code Online (Sandbox Code Playgroud)

一致性的好处之一是修饰符(尤其是注释)可以应用于局部变量和 lambda 形式而不失简洁:

    @Nonnull var x = new Foo();
    (@Nonnull var x, @Nullable var y) -> x.process(y)
Run Code Online (Sandbox Code Playgroud)

如果可以跳过它,您应该使用它吗?

可能在某些情况下您需要使用它(如果您工作的项目具有强制使用的严格编码约定)。在其他情况下,它可能是基于意见的。

我的具体意见是:如果你不需要它,就不要使用它。

  • 如果您需要注释 lambda 参数,您将需要它
  • 否则将其忽略