Logo
Section 1 / 3

局部变量类型与Lambda表达式

了解 Java 10 和 11 中的 Lambda 表达式和局部变量类型。

导入

局部变量类型与Lambda表达式

了解 Java 10 和 11 中的 Lambda 表达式和局部变量类型。

一点历史

Java 10 于 2018 年 3 月发布,Java 11 于 2018 年 9 月发布。由于 Java 11 是长期支持版本(LTS),许多开发者可能会直接从 Java 8 升级到 Java 11。

Java 10 的主要重大更新是 局部变量类型推断(var)。它还对垃圾回收和编译进行了优化,但这些改进不会影响我们的代码编写方式。

...

局部变量类型

尽管 var 不是一个新关键字,但它是一种上下文敏感的类型,对 Java 开发者来说是一次巨大的进步。它允许我们在 Java 编译器能够明确从上下文中推断出类型时,用 var 替代类型声明。

来看一段使用 Java 10+ 编写的代码片段:

1@Test 2public void testDoParallelSquares() { 3 var result = demo.doParallelSquares() 4 .stream().sorted().collect(Collectors.toList()); 5 assertArrayEquals(squares.toArray(), result.toArray()); 6}

这里的 result 类型由赋值右侧的表达式自动推断得出,在此例中为 List 类型。

只要不影响人类读者的理解,当右侧表达式的类型清晰明确时,就可以使用 var。例如,以下列表的初始化:

1var list = new ArrayList();

需要注意的是,此时 list 的类型是原始类型 ArrayList。但在某些情况下,这种写法对我们来说已经足够。

在任何 Java 代码中,合理使用 var 都可以在不丢失信息的前提下简化代码。例如:

1var foo = Flowable.just("foo"); //1 2var flow = Flowable.just(1, 4, 9); //2 3var flowable = flow.map(i -> "string " + i); //3
  1. 创建一个包装单个值的 RxJava Flowable。
  2. 声明一个包含初始值的 Flowable。
  3. 声明一个中间处理步骤。

尤其是在测试代码中,var 能有效简化 Java 代码的书写。

1var publisher = TestPublisher.create(); //1 2var flux = publisher.flux(); //2
  1. 从 Reactor 创建一个 TestPublisher。
  2. 将其转换为一个 Flux。

Lambda 表达式中的局部变量类型

在 Java 11 中,var 也可以用于 Lambda 表达式的参数中,以保持语言的一致性。例如,以下代码:

1flowable.subscribe(next -> list.add(next), ex -> ex.printStackTrace());

在 Java 11 中可以改为:

1flowable.subscribe((var next) -> list.add(next), 2 (var ex) -> ex.printStackTrace());

虽然语法略显冗长,但这增强了 Java 语言的一致性,并允许在不指定类型的情况下为参数添加注解。例如:

1flowable.subscribe((@NonNull var next) -> list.add(next), 2 (@NonNull var ex) -> ex.printStackTrace());

Java 语法与规范

Java 12 到 17 的新特性