Java Language Références de méthode


Exemple

Les références de méthode permettent aux méthodes statiques ou d'instance prédéfinies qui adhèrent à une interface fonctionnelle compatible d'être transmises en tant qu'argument au lieu d'une expression lambda anonyme.

Supposons que nous ayons un modèle:

class Person {
    private final String name;
    private final String surname;

    public Person(String name, String surname){
        this.name = name;
        this.surname = surname;
    }

    public String getName(){ return name; }
    public String getSurname(){ return surname; }
}

List<Person> people = getSomePeople();

Référence de la méthode d'instance (à une instance arbitraire)

people.stream().map(Person::getName)

Le lambda équivalent:

people.stream().map(person -> person.getName())

Dans cet exemple, une référence de méthode à la méthode d'instance getName() de type Person est en cours de transmission. Comme il est connu pour être du type collection, la méthode de l'instance (connue plus tard) sera appelée.


Référence de la méthode d'instance (à une instance spécifique)

people.forEach(System.out::println);

Puisque System.out est une instance de PrintStream , une référence de méthode à cette instance spécifique est transmise en tant qu'argument.

Le lambda équivalent:

people.forEach(person -> System.out.println(person));

Référence de méthode statique

Aussi, pour transformer des flux, nous pouvons appliquer des références à des méthodes statiques:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.stream().map(String::valueOf)

Cet exemple transmet une référence à la méthode static valueOf() sur le type String . Par conséquent, l'objet instance dans la collection est transmis en tant qu'argument à valueOf() .

Le lambda équivalent:

 numbers.stream().map(num -> String.valueOf(num))

Référence à un constructeur

List<String> strings = Arrays.asList("1", "2", "3");
strings.stream().map(Integer::new)

Lire Collecter les éléments d'un flux dans une collection pour voir comment collecter les éléments à collecter.

Le seul constructeur d'argument String du type Integer est utilisé ici pour construire un entier à partir de la chaîne fournie comme argument. Dans ce cas, tant que la chaîne représente un nombre, le flux sera mappé aux nombres entiers. Le lambda équivalent:

strings.stream().map(s -> new Integer(s));

Cheat-Sheet

Format de référence de la méthode Code Lambda équivalent
Méthode statique TypeName::method (args) -> TypeName.method(args)
Méthode non statique (sur instance * ) instance::method (args) -> instance.method(args)
Méthode non statique (pas d'instance) TypeName::method (instance, args) -> instance.method(args)
Constructeur ** TypeName::new (args) -> new TypeName(args)
Constructeur tableau TypeName[]::new (int size) -> new TypeName[size]

* instance peut être n'importe quelle expression qui donne une référence à une instance, par exemple getInstance()::method , this::method

** Si TypeName est une classe interne non statique, la référence du constructeur est uniquement valide dans le cadre d'une instance de classe externe