Wie weisen Sie einer Variablen in Java 8 ein Lambda zu?
Lesezeit: 3 Minuten
Ich spiele nur mit den neuen Lambda- und Funktionsfunktionen in Java 8 und bin mir nicht sicher, wie ich das machen soll.
Beispielsweise gilt:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.compute("A", (k, v) -> v == null ? 42 : v + 41));
aber das Folgende gibt mir Syntaxfehler:
BiFunction x = (k, v) -> v == null ? 42 : v + 41;
map.compute("A", x);
Irgendwelche Ideen?
Bitte poste die tatsächlichen Syntaxfehler.
– JBCP
20. Februar 2014 um 21:46 Uhr
Sie haben die Generika auf Ihrem vergessen BiFunction:
public static void main(final String[] args) throws Exception {
final Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
final BiFunction<String, Integer, Integer> remapper = (k, v) -> v == null ? 42 : v + 41;
map.compute("A", remapper);
}
Betrieb:
PS C:\Users\Boris> java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b120)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b62, mixed mode)
Cool. Ich verstehe – ich muss das sehr deutlich machen. Wenn Sie sich den Parametertyp ansehen, wenn Sie sich die map.compute-Methode ansehen, wird er nur als BiFunction allein angezeigt.
– Sprossjunge
20. Februar 2014 um 21:48 Uhr
Die Java 8-Typinferenz wurde gegenüber früheren Versionen erheblich verbessert. Sie müssen immer noch die generischen Typen am Anfang eines Ausdrucks angeben, damit der Compiler damit arbeiten kann. Schaut man sich die an Javadoc für Map Sie können die erforderlichen Typen sehen.
– Boris die Spinne
20. Februar 2014 um 21:52 Uhr
Beachten Sie, dass “final” nicht erforderlich ist. Es kompiliert gut ohne das. Keine Ahnung, ob das ein Bug oder ein Feature ist.
– Sprossjunge
20. Februar 2014 um 21:58 Uhr
@sproketboy in früheren Versionen von Java final war erforderlich, damit eine lokale Variable in einer anonymen Klasse zugänglich ist. In Java 8 hat sich dies geändert, die Anforderung ist nun, dass die Variable “effektiv final” ist, dh wenn der Compiler feststellt, dass die Variable nicht neu zugewiesen wird. Also Funktion…
– Boris die Spinne
20. Februar 2014 um 22:09 Uhr
Ihr Beispiel verwendet keinen Remapper in einem AIC oder in einem Lambda, daher muss es nicht einmal effektiv final sein. Du könntest entfernen final aus der Deklaration entfernen und den Remapper später etwas anderem zuweisen, und es würde immer noch funktionieren.
– Stuart Marks
21. Februar 2014 um 2:04 Uhr
JBCP
Wie Boris The Spider betont, sind die Generika das spezifische Problem, das Sie haben. Je nach Kontext trägt das Hinzufügen eines expliziten {}-Blocks um das Lambda herum zu mehr Klarheit bei und ist möglicherweise erforderlich.
Damit würdest du so etwas bekommen:
BiFunction<String, Integer, Integer> x = (String k, Integer v) -> {v == null ? 42 : v + 41};
Es wäre sehr hilfreich für zukünftige Leser, die das gleiche Problem haben, wenn Sie Ihre Syntaxfehler posten würden, damit sie indiziert werden können.
Dieser Link hat einige zusätzliche Beispiele, die helfen könnten.
Das ist nicht ganz richtig – siehe meine Antwort. BiFunction nimmt 3 Arten von Argumenten.
– Boris die Spinne
20. Februar 2014 um 21:43 Uhr
Beispiel für die Übergabe eines Lambda, das eine Methode enthält
YourClass myObject = new YourClass();
// first parameter, second parameter and return
BiFunction<String, YourClass, String> YourFunction;
YourFunction = (k, v) -> v == null ? "ERROR your class object is null" : defaultHandler("hello",myObject);
public String defaultHandler(String message, YourClass Object)
{
//TODO ...
return "";
}
14496100cookie-checkWie weisen Sie einer Variablen in Java 8 ein Lambda zu?yes
Bitte poste die tatsächlichen Syntaxfehler.
– JBCP
20. Februar 2014 um 21:46 Uhr