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的默认变量占位符。
答案 0 :(得分:22)
观察到了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等语言类似。或者他们可能使用不同或根本不使用它。我们必须等一下。