Signification de: dans la syntaxe Java [dupliquer]


Cette question a déjà une réponse ici:

Quelle est la signification de :: dans le code suivant?

Set<String> set = people.stream()
                        .map(Person::getName)
                        .collect(Collectors.toCollection(TreeSet::new));
Author: Eran, 2014-11-19

3 answers

C'est la référence de la méthode. Ajouté en Java 8.

TreeSet::new désigne le constructeur par défaut de TreeSet.

En général A::B fait référence à la méthode B dans la classe A.

 25
Author: Eran, 2014-11-19 11:17:45

:: est appelé Référence de méthode. C'est essentiellement une référence à une seule méthode. il s'agit d'une méthode existante par son nom.

Method reference using :: est un commodité opérateur.

La référence de méthode est l'une des fonctionnalités appartenant àJava lambda expressions . La référence de méthode peut être exprimée en utilisant le format de syntaxe d'expression lambda habituel en utilisant –> Afin de le rendre plus simple :: l'opérateur peut être utilisé.

Exemple:

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) {
        }
    }
}

Donc, Dans votre exemple:

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

Appelle/crée un "nouvel" treeset.

Un exemple similaire d'une référence Contstructor est:

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());
    }
}
 14
Author: jbutler483, 2014-11-19 11:31:50

Person:: getName dans ce contexte est un raccourci pour (Person p) -> p.getName()

Voir plus d'exemples et d'explications détaillées dans JLS article 15.13

 6
Author: Misha, 2014-11-19 11:28:22