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

时间:2015-03-27 14:22:37

标签: 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)

假设定义了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());

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

2 个答案:

答案 0 :(得分:22)

已经proposed and rejected

  观察到了wunderbars并且(绝大多数)被EG拒绝了。

答案 1 :(得分:9)

没有,没有。您可以使用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版本可以使用_作为lambdas的默认占位符,其方式与Scala等语言类似。或者他们可能使用不同或根本不使用它。我们必须等一下。