java11新特性--Local-Variable Syntax for Lambda Parameters

简介

允许在隐式类型的lambda表达式中使用var来声明参数

目标

统一隐式类型lambda表达式参数声明语法和普通本地变量声明语法

动机

一个lambda表达式可能是隐式类型的,它的类型是靠推断获得的,如下:

(x, y) -> x.process(y)
复制代码

在java 10中出现了隐式类型的本地变量:

var x = new Foo();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...
复制代码

为了统一本地变量,我们希望能够在隐式的lambda表达式中使用var声明参数:

(var x, var y) -> x.process(y)
复制代码

这种统一的一个好处就是modifiers(特别是一些注解)可以完全一致的用于本地变量和lambda表达式:

@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)
复制代码

描述

对于隐式类型的lambda表达式,允许省略掉var,如下:

@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)
复制代码

和下面是等价的

(x, y) -> x.process(y)
复制代码

隐含类型的lambda表达式的参数要么全部使用var,要么全不使用var。并且var只能用于隐含类型的lambda表达式,那些显示类型的lambda表达式是不能用var的,比如下面的例子是不合法的:

(var x, y) -> x.process(y)        
(var x, int y) -> x.process(y) 
复制代码

理论上说上面的第二种半隐式类型(也有人叫半显示类型),但是它已经超出本JEP的讨论范围了,因为它影响到推断和重载机制。这就是为什么当前强制限制lambda表达式只能是全显示或隐式的原因。我们也强制无论隐式lambda表达式的参数是否带var都不影响推断。我们可能在未来的JEP中解决部分推断的问题,但是我们不希望你以如下速记方式的语法,所以下面的表达式是不合法的:

var x -> x.foo()复制代码


转载于:https://juejin.im/post/5baee5a3f265da0af4071b0c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值