Ich versuche, im folgenden Collectors.toMap()
Aufruf einen prägnanteren Ausdruck für den Funktionsparameter "keyMapper" zu finden :
List<Person> roster = ...;
Map<String, Person> map =
roster
.stream()
.collect(
Collectors.toMap(
new Function<Person, String>() {
public String apply(Person p) { return p.getLast(); }
},
Function.<Person>identity()));
Es scheint, dass ich in der Lage sein sollte, es mit einem Lambda-Ausdruck zu inline, aber ich kann mir keinen ausdenken, der kompiliert. (Ich bin ziemlich neu in Lambdas, das ist also keine große Überraschung.)
Vielen Dank.
-> Update:
Wie in der akzeptierten Antwort angegeben
Person::getLast
ist das, wonach ich gesucht habe und was ich versucht habe. Der nächtliche BETA_8-Build von Eclipse 4.3 war jedoch das Problem - er hat dies als falsch gekennzeichnet. Beim Kompilieren über die Befehlszeile (was ich vor dem Posten hätte tun sollen) hat es funktioniert. Also, Zeit, einen Fehler bei eclipse.org zu melden.
Vielen Dank.
java
collections
lambda
java-8
java-stream
pfurbacher
quelle
quelle
Antworten:
Sie können ein Lambda verwenden:
oder genauer gesagt, Sie können eine Methodenreferenz verwenden, indem Sie Folgendes verwenden
::
:und stattdessen
Function.identity
können Sie einfach das entsprechende Lambda verwenden:Wenn Sie Netbeans verwenden, sollten Sie Hinweise erhalten, wann immer eine anonyme Klasse durch ein Lambda ersetzt werden kann.
quelle
Collectors.toMap(Person::getLast, p -> p)
. H.Collectors.toMap(Person::getLast, Function.identity())
Das wäre die Übersetzung, aber ich habe dies nicht ausgeführt oder die API verwendet. höchstwahrscheinlich können Sie Function.identity () durch p -> p ersetzen. und statisch in Map importieren (...)
quelle
Wir können eine optionale Zusammenführungsfunktion auch bei derselben Schlüsselkollision verwenden. Wenn beispielsweise zwei oder mehr Personen denselben Wert für getLast () haben, können Sie angeben, wie die Werte zusammengeführt werden sollen. Wenn wir dies nicht tun, könnten wir IllegalStateException bekommen. Hier ist das Beispiel, um dies zu erreichen ...
Map<String, Person> map = roster .stream() .collect( Collectors.toMap(p -> p.getLast(), p -> p, (person1, person2) -> person1+";"+person2) );
quelle
(person1, person2) -> person1+";"+person2)