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

Sri*_*i K 18 lambda java-8

在java8中是否有lambdas的默认变量占位符,比如_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)
Run Code Online (Sandbox Code Playgroud)

假设定义了一个Person类,这里是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());
Run Code Online (Sandbox Code Playgroud)

有没有办法在最后一行编写过滤器而不定义变量p.显然这不是一个大问题,但只是好奇.我也明白我可以在Person类中编写一个方法isTeenager并将其传递给lambda,但这也不是重点.只想知道java8中是否有lambdas的默认变量占位符.

ass*_*ias 22

它被提出并被拒绝:

EG被认为并且(压倒性地)拒绝了wunderbars.


bla*_*dri 9

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

List<Person> teens = people.stream()
                       .filter(Person::isATeen)
                       .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

(假设您定义的方法是在Person中定义的.您可以在别处定义它.)

这样您就不必为Person过滤器中的实例显式创建名称.你当然会在这个方法中这样做,所以它并没有好多少.

更新:对于JEP 302, JDK 9中的第2阶段,下划线实际上已成为任何位置变量的非法名称.这样,未来的Java版本可以_用作lambdas的默认占位符,其方式与Scala等语言类似.或者他们可能使用不同或根本不使用它.我们得等一下.