java8 中是否有 lambda 的默认变量占位符?

Is there a default variable placeholder for lambdas in java8?

java8 中是否有 lambda 的默认变量占位符,如 scala 的 _

这是 scala 示例:

case class Person(name:String, age:Int)
val people = List(Person("Jack", 35), Person("Arjun", 16), Person("Sasha", 13), Person("Sara", 8))
val teens = people.filter(_.age >= 13).filter(_.age <= 19)

假设定义了一个人 class,这里是 java 例子:

List<Person> people = Arrays.asList(new Person("Jack", 35), new Person("Arjun", 16), new Person("Sasha", 13), new Person("Sara", 8));
List<Person> teens = people.stream()
                           .filter(p -> (p.getAge() >= 13 && p.getAge() <= 19))
                           .collect(Collectors.toList());

有没有办法在不定义变量的情况下在最后一行编写过滤器 p。显然这不是什么大问题,只是好奇而已。我也明白我可以在 Person class 中编写一个方法,比如 isTeenager 并将其传递给 lambda,但这也不是重点。只想知道 java8.

中是否有 lambda 的默认变量占位符

没有,没有。您可以使用 method reference 使其更接近一点;为此,您将定义一个布尔方法 isATeen(Person p) 然后执行如下操作:

List<Person> teens = people.stream()
                       .filter(Person::isATeen)
                       .collect(Collectors.toList());

(假设你定义的方法是在Person中定义的。你可以在其他地方定义它。)

这样您就不必在过滤器中为 Person 的实例显式创建名称。你当然在方法中这样做了,所以也好不了多少。

更新: JDK 9 中的 JEP 302, Phase 2 下划线实际上已成为任何位置的变量的非法名称。这样,未来的 Java 版本可能会使用 _ 作为 lambda 的默认占位符,类似于 Scala 等语言。或者他们可能会以不同的方式使用它或根本不使用它。我们拭目以待。

已经proposed and rejected:

wunderbars were considered and (overwhelmingly) rejected by the EG.