Есть ли переменная-заполнитель по умолчанию для lambdas в java8?

Есть ли переменная-заполнитель по умолчанию для lambdas в java8, например _ для 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, и передать его лямбда, но это не так. Просто хочу знать, есть ли переменная-заполнитель по умолчанию для lambdas в java8.

Ответы

Ответ 2

Нет, нет. Вы можете использовать ссылку , чтобы сделать ее немного ближе; для этого вы бы определили логический метод isATeen(Person p) и затем сделали бы что-то вроде этого:

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

(Предполагая, что вы определили метод, определенный в Person. Его можно определить в другом месте.)

Таким образом, вам не нужно явно создавать имя для экземпляра Person в фильтре. Вы, конечно, делаете это в методе, поэтому он не намного лучше.

ОБНОВЛЕНИЕ: С JEP 302, Phase 2 в JDK 9 подчеркивание фактически стало незаконным именем для переменная в любом положении. Таким образом, будущие версии Java могут использовать _ как заполнитель по умолчанию для lambdas аналогично языкам, таким как Scala. Или они могут использовать его по-другому или вообще не использовать. Нам придется подождать.