2016-04-12 2 views
5

Gegeben ..Verwendung von Konstruktor Referenz wo Konstruktor hat eine nicht leere Parameterliste

List<Foo> copy(List<Foo> foos) { 
    return foos 
      .stream() 
      .map(foo -> new Foo(foo)) 
      .collect(Collectors.toList()); 
} 

IntelliJ IDEA 2016.01.01 berichtet, dass new Foo(foo) „kann mit der Methode Referenz ersetzt werden“.

Ich bin der Foo::new-Syntax für den Konstruktor no-arg bekannt, aber sehe nicht, wie ich foo in als Argument übergeben konnte. Ich verpasse hier sicher etwas.

+1

Beginnen Sie immer mit der funktionalen Schnittstelle. 'map()' nimmt eine 'Funktion', die einen Parameter akzeptiert und einen Wert zurückgibt. Beim Zuordnen eines Konstruktorreferenz zu einer 'Funktion' ist der Rückgabewert offensichtlich der Typ, der konstruiert wird, aber da' Funktion' einen Parameter benötigt, muss auch der Konstruktor. Wenn der Funktionstyp eine BiFunktion gewesen wäre, hätte er nach einem Konstruktor mit zwei Parametern gesucht. Wenn der Funktionstyp ein "Lieferant" gewesen wäre, der keine Parameter akzeptiert, hätte er einen Konstruktor ohne Argumente aufgerufen. –

Antwort

8

Ich bin mir bewusst, der Foo::new Syntax für den nicht-arg Konstruktor

Das ist nicht das, was Foo::new tut. This expression will expand to what is needed in the context it's used.

In diesem Fall

List<Foo> copy(List<Foo> foos) { 
    return foos.stream().map(Foo::new).collect(Collectors.toList()); 
} 

für einen Konstruktor aussehen würde, die ein Foo Argument benötigt.

+0

A-ha, sehr hilfreich! Danke für die Einstellung dieser geraden Säule. –

+0

@Pillar Gut erklärt –

+4

Genauer gesagt, es wird den _target type_ der Methode ref als Eingabe verwenden, um die Auswahl zu überlasten, um den richtigen Konstruktor zu finden. –

Verwandte Themen