В чем смысл :: в следующем коде?
Set<String> set = people.stream()
.map(Person::getName)
.collect(Collectors.toCollection(TreeSet::new));
В чем смысл :: в следующем коде?
Set<String> set = people.stream()
.map(Person::getName)
.collect(Collectors.toCollection(TreeSet::new));
Это ссылка на метод. Добавлено в Java 8.
TreeSet::new
относится к конструктору по умолчанию TreeSet
.
Обычно A::B
ссылается на метод B
в классе A
.
::
называется ссылкой на метод. Это в основном ссылка на один метод. то есть он ссылается на существующий метод по имени.
Method reference using ::
- оператор удобства.
Ссылка на метод является одной из функций, относящихся к Java lambda expressions. Ссылка на метод может быть выражена с использованием обычного формата синтаксиса выражения лямбда, используя –>
. Чтобы сделать его более простым, может использоваться оператор ::
.
Пример:
public class MethodReferenceExample {
void close() {
System.out.println("Close.");
}
public static void main(String[] args) throws Exception {
MethodReferenceExample referenceObj = new MethodReferenceExample();
try (AutoCloseable ac = referenceObj::close) {
}
}
}
Set<String> set = people.stream()
.map(Person::getName)
.collect(Collectors.toCollection(TreeSet::new));
Является вызовом/созданием "нового" дерева.
Аналогичный пример ссылки Contstructor Reference:
class Zoo {
private List animalList;
public Zoo(List animalList) {
this.animalList = animalList;
System.out.println("Zoo created.");
}
}
interface ZooFactory {
Zoo getZoo(List animals);
}
public class ConstructorReferenceExample {
public static void main(String[] args) {
//following commented line is lambda expression equivalent
//ZooFactory zooFactory = (List animalList)-> {return new Zoo(animalList);};
ZooFactory zooFactory = Zoo::new;
System.out.println("Ok");
Zoo zoo = zooFactory.getZoo(new ArrayList());
}
}
Person:: getName в этом контексте является сокращением для (Person p) -> p.getName()
Дополнительные примеры и подробные объяснения в JLS-раздел 15.13