Ответ 1
Он был предложен и отклонен:
wunderbars были рассмотрены и (подавлятельно) отклонены EG.
Есть ли переменная-заполнитель по умолчанию для 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.
Он был предложен и отклонен:
wunderbars были рассмотрены и (подавлятельно) отклонены EG.
Нет, нет. Вы можете использовать ссылку , чтобы сделать ее немного ближе; для этого вы бы определили логический метод 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. Или они могут использовать его по-другому или вообще не использовать. Нам придется подождать.