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

Benutzeravatar von JBCP
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 "";
}

1449610cookie-checkWie weisen Sie einer Variablen in Java 8 ein Lambda zu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy