导入
局部变量类型与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
- 创建一个包装单个值的 RxJava Flowable。
- 声明一个包含初始值的 Flowable。
- 声明一个中间处理步骤。
尤其是在测试代码中,var 能有效简化 Java 代码的书写。
1var publisher = TestPublisher.create(); //1 2var flux = publisher.flux(); //2
- 从 Reactor 创建一个 TestPublisher。
- 将其转换为一个 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());