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 等语言。或者他们可能会以不同的方式使用它或根本不使用它。我们拭目以待。
wunderbars were considered and (overwhelmingly) rejected by the EG.
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.
没有,没有。您可以使用 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 等语言。或者他们可能会以不同的方式使用它或根本不使用它。我们拭目以待。
wunderbars were considered and (overwhelmingly) rejected by the EG.