Значение:: в синтаксисе Java

В чем смысл :: в следующем коде?

Set<String> set = people.stream()
                        .map(Person::getName)
                        .collect(Collectors.toCollection(TreeSet::new));

Ответ 1

Это ссылка на метод. Добавлено в Java 8.

TreeSet::new относится к конструктору по умолчанию TreeSet.

Обычно A::B ссылается на метод B в классе A.

Ответ 2

:: называется ссылкой на метод. Это в основном ссылка на один метод. то есть он ссылается на существующий метод по имени.

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());
    }
}

Ответ 3

Person:: getName в этом контексте является сокращением для (Person p) -> p.getName()

Дополнительные примеры и подробные объяснения в JLS-раздел 15.13