2016-08-23 1 views
1

Zum Beispiel könnte ich möchte wie dies eine Zuordnung tun (in JavaScript):Gibt es eine sofort aufgerufene anonyme Funktion für Java?

var x = (function() { 
    // do some searching/calculating 
    return 12345; 
})(); 

Und in Java, wie kann ich tun etwas ähnliches mit Lambda-Ausdrücke? Der Compiler nicht wie etwas wie folgt aus:

Item similarItem =() -> { 
    for (Item i : POSSIBLE_ITEMS) { 
     if (i.name.equals(this.name)) return i; 
    } 
    return null; 
}(); 
+0

Warum möchten Sie das? Was macht dein Javascript-Code anders, weil es in einem IIFE ist? – Blorgbeard

+0

Ich glaube nicht, dass es möglich ist, weil der Compiler wissen muss, welche funktionale Schnittstelle das Lambda genau implementiert. – nitish712

+4

Wenn Sie Code möchten, der sofort ausgeführt wird, schreiben Sie Code ohne Lambda. –

Antwort

7

Nein, weil lambdas einen Zieltyp benötigen. Das Beste, was Sie tun können, ist der folgende Ausdruck:

Item similarItem = ((Supplier<Item>) (() -> { 
    for (Item i : POSSIBLE_ITEMS) { 
     if (i.name.equals(this.name)) return i; 
    } 
    return null; 
})).get(); 

Sie müssen die korrekte funktionale Schnittstelle für Ihr bestimmtes Lambda verwenden. Wie Sie sehen können, ist es sehr klobig und nicht nützlich.


UPDATE

Der obige Code ist eine direkte Übersetzung des JavaScript-Code. Die direkte Konvertierung von Code liefert jedoch nicht immer das beste Ergebnis.

In Java würden Sie tatsächlich streams verwenden zu tun, was der Code tut:

Item similarItem = POSSIBLE_ITEMS.stream() 
           .filter(i -> i.name.equals(this.name)) 
           .findFirst() 
           .orElse(null); 

Der obige Code wird davon ausgegangen, dass POSSIBLE_ITEMS ist ein Collection, wahrscheinlich ein List. Wenn es ein Array ist, verwenden Sie stattdessen:

Item similarItem = Arrays.stream(POSSIBLE_ITEMS) 
         .filter(i -> i.name.equals(this.name)) 
         .findFirst() 
         .orElse(null); 
+0

Ich mochte Ihre Antwort, fand sie aber unvollständig, also erweiterte ich sie, anstatt eine neue Antwort zu erstellen . Hoffe, das ist in Ordnung. – Andreas

+0

Ich liebe die Stream-Idee! Erinnert mich an Schluck! Sind die Streams weniger effizient oder speichermäßig als der Collection Iterator? – Dylanthepiguy

Verwandte Themen