2016-07-01 1 views
1

Je l'exemple suivant:méthode Comprendre référence

public class App { 
    public static void main(String[] args) { 
     List<Car> list = Arrays.asList(new Car("green"), new Car("blue"), new Car("white")); 
     //Ex. 1 
     List<String> carColors1 = list.stream().map(CarUtils::getCarColor).collect(Collectors.toList()); 
     //Ex. 2 
     List<String> carColors2 = list.stream().map(Car::getColor).collect(Collectors.toList()); 
    } 

    static class CarUtils { 
     static String getCarColor(Car car) { 
      return car.getColor(); 
     } 
    } 

    static class Car { 
     private String color; 

     public Car(String color) { 
      this.color = color; 
     } 

     public String getColor() { 
      return color; 
     } 
    } 
} 

Ex. 1 fonctionne depuis la méthode getCarColor en CarUtils classe a la même méthode de signature et le type de retour en tant que apply méthode en Function interface.

Mais pourquoi Ex. 2 œuvres? La méthode dans Car classe a une signature de méthode différente de apply et je m'attends à obtenir une erreur de temps de compilation ici.

+3

Vous pouvez considérer la méthode 'getColor' comme ayant un paramètre implicite' this' qui est passé dans la méthode. Certaines langues rendent cela explicite. Donc vous avez essentiellement une fonction qui prend une instance de 'Car' et retourne un' String'. –

Répondre

2

La méthode getColor de la classe Car a une signature différente de la méthode apply et j'attends ici une erreur de temps de compilation.

Pas vraiment. Car.getColor() est une méthode d'instance. Vous pouvez le voir comme une fonction qui prend un argument: this, de type Car, et renvoie une chaîne. Donc, cela correspond à la signature de apply() dans Function<Car, String>.

+0

Disons que j'ai une méthode d'instance qui prend deux arguments. A-t-il réellement trois arguments et le premier serait une instance dans laquelle la méthode appartient? – user1745356

+3

S'il existe plusieurs paramètres, le premier paramètre sera toujours l'instance de classe. –