2017-02-12 2 views
3

Meine Frage ist Lambda und Methodenreferenzen sind alles über funktionale Schnittstellen. Sie liefern nur die Implementierung von ihnen. Jetztjava 8 Methodenreferenz hinter der Szene

wenn ich schreibe:

class Apple{ 
private int weight; 
private String color; 

public String getColor() { 
    return color; 
} 

public void setColor(String color) { 
    this.color = color; 
} 

public int getWeight() { 
    return weight; 
} 

public void setWeight(int weight) { 
    this.weight = weight; 
}} 

und wenn ich schreibe:

  Function<Apple, Integer> getWeight = Apple::getWeight; 

oder

 appleList.stream().map(Apple::getColor).collect(toList()); 

wie ist es eigentlich meine Getter nicht funktioniert wird jeden Parameter von Apple unter ? weil nach Funktion funktionale Schnittstelle

@FunctionalInterface 
public interface Function<T, R> { 
R apply(T t);} 

es ein Parameter und etwas erwartet zurückkehren und es sollte tatsächlich funktioniert wenn der Getter wie ist:

public int getWeight(Apple a) { 
    return a.weight; 
} 

i wenig Dank verwirrt im Voraus am

Antwort

3

Solch ein Function<Apple, Integer> ist nicht mit einer Instanz von Apple zu verwechseln.

Erinnerst du dich an Funktionen von der Schule?
Sie müssen ein Element aus der Domäne (hier ein Apfel von Apple s) nehmen und es wird genau auf ein entsprechendes Element aus codomain (hier eine ganze Zahl aus Integer s) angepasst werden. Function selbst ist keinem bestimmten Apfel zugeordnet.

können Sie es auf diese Weise verwenden:

List<Apple> apples = new ArrayList<Apple>(); 
apples.add(new Apple(120, "red")); 
apples.add(new Apple(150, "green")); 
apples.add(new Apple(150, "yellow")); 
List<String> colors = apples.stream() 
          .map(Apple::getColor) 
          .collect(Collectors.toList()); 
System.out.println(colors); 

Apple::getColor entspricht einem Function<Apple, String>, die Farbe jeder Apfel zurückgibt:

Function<Apple, Integer> getColor = new Function<Apple, Integer>() { 
    @Override 
    public Integer apply(Apple apple) { 
     return apple.getColor(); 
    } 
}; 

Außerdem

List<String> colors = apples.stream() 
          .map(Apple::getColor) 
          .collect(Collectors.toList()); 

entspricht :

List<String> colors = apples.stream() 
          .map(apple -> apple.getColor()) 
          .collect(Collectors.toList()); 
3

Dies ist eindeutig im Tutorial Method reference als Verweis auf eine Instanz Methode eines beliebigen Objekts eines bestimmten Typs dokumentiert. Da das Objekt den Typ des Referenzmethode-Typs hat, wird das Objekt das Objekt sein, auf dem die Methode aufgerufen wird. Bedeutet:

map(Apple::getColor) 

entspricht:

map(a -> a.getColor()) 
Verwandte Themen