这也许是新提出的功能中最有争议的一个。当前lambda参数不允许影响外部变量,意味着参数名称必须不同于当前作用域中可访问的任何变量;这与其他包含作用域保持一致,比如while循环或if语句:
String s = "hello"; if(finished) { String s = "bye"; // 错误,s已经定义 } Predicate<String> ps = s -> s.isEmpty(); // 错误,s已经定义如果建议的更改继续下去,lambda参数将能够重复使用和隐藏现有标识符。在某些情况下,这可能有利于用户,也就是说他们不需要使用其他不太直接的名称作为他们的lambda参数名称(上面的例子通常会被重写为s2 - > s2.isEmpty()),但是,就像国际知名演讲者Roy Van Rijn提出的那样,它也可能引入微小的错误:
Map<String, Integer> map = /* ... */ String key = "theInitialKey"; map.computeIfAbsent(key, _ -> { String key = "theShadowKey"; // shadow variable return key.length(); });目前,上述代码是不被允许的,但根据新提案这也可能是对的。如果标记为“shadow variable”的行被删除,代码将仍然可以编译和运行,但它会做完全不同的事情。
为了评估上述更改是否将被引入Java以及将以什么形式引入,他们还将进行更多的讨论。然而,毫无疑问的是,在Java 8中引入lambda只是未来Java语言的众多改进的第一步。