mmofacts.com

Java und Lambda-Ausdrücke

gepostet vor 12 Jahre, 10 Monate von TheUndeadable

Da ich momentan überlege, ob und wie ich ein vorhandenes .Net-Projekte auf Java portiere, würde mich interessieren, wie der gute Java-Programmierer mit fehlenden Java-Ausdrücken umgeht:

Auszug aus einem Chat, habe bisher kein Feedback erhalten :-)

(12:15:57) TheUndeadable: Ola, ist hier ein Java-Künstler dabei und kann mir sagen, wie man folgenden Ausdruck mit Lambda möglichst schön nach Java übersetzen kann?
(12:16:14) TheUndeadable: vector players = getPlayers();
(12:16:38) TheUndeadable: vector interestingPlayer = players.Where (x=> x.PlayerId > 100);
(12:16:59) TheUndeadable: Also ist jetzt Pseudo-Java/C#... Ich will wissen wie der Java-Programmierer mit den fehlenden Lambdas umgeht.

Danke für jede Art von Input...

gepostet vor 12 Jahre, 10 Monate von Phoscur

Bin jetzt kein Java-Auskenner, aber mir fallen da spontan zwei Möglichkeiten ein:

Füge Methode in der Playerklasse getInteresting() oder getWithPlayerIdOverHundred() hinzu.

Ansonsten kann man auch Lambda-ähnliche Funktionalität und Struktur durch Anonyme Klassen erhalten.

gepostet vor 12 Jahre, 10 Monate von buhrmi

Ich hab nur 3 Worte für dich: Scala, Scala und Scala.

Hier noch ein viertes: Scala

Wünsche dir viel Scala,
Scala

gepostet vor 12 Jahre, 10 Monate von buhrmi

Oder in Java 7 kann man so komische Sachen machen wie

player = pleaseFindDummyPlayer() 

bool idIsMoreThan100 = #(arg)(arg.player_id > 100).(player)

gepostet vor 12 Jahre, 10 Monate von exe

Kurze Antwort: gar nicht. Soviele Möglichkeiten hast du mit Java 6 da nicht: entweder du programmierst die Filtermethoden aus oder bastelst dir irgendwelche Konstrukte mit anonymen Klassen, sowas in der Art von:

Java:

interface Matcher {

    public boolean match(T item);

// ...

Vector interestingPlayers = players.filter(new Matcher() {

    public boolean match(Player player) { return player.getPlayerId() > 100; }

});

Eleganter kannst du in Java 6 lambda/closures und was es so gibt eigentlich nicht ersetzen ...

gepostet vor 12 Jahre, 10 Monate von TheUndeadable

Original von buhrmi

Ich hab nur 3 Worte für dich: Scala, Scala und Scala.

Hier noch ein viertes: Scala

Wünsche dir viel Scala,
Scala

Mit Scala habe ich die Tage ein bisschen gearbeitet, aber ich muss sagen, dass die Eclipse-Integration mehr als grottig ist.

Habe das gefühl, dass der 'Syntax-Error-Highlighter' eine andere Scala-Sprach-Version als die des wahren Compilers nutzt. Es werden Fehler angezeigt, die beim Kompilieren nicht auffallen. Vom fehlenden, bzw. nicht funktionierendem Intellisense mal abgesehen.

Merkwürdig und intransparent fand ich auch so manche Sprachkonstrukte und so wirklich warm bin ich mit der Sprache noch nicht geworden. Ich werde aber an Scala dran bleiben!

Zum Thema selbst:

@exe:

Danke für den Tipp, den hatte ich auch mehrfach im Internet gesehen und scheint auch die momentane 'state-of-the-art'-Lösung zu sein. Für meine Zwecke erstmal ausreichend, auch wenn da viel Boiler-Plate-Code dabei ist und man keine lokalen Variablen nutzen kann. Aber das tu ich sowieso nur sehr selten.

Füge Methode in der Playerklasse getInteresting() oder getWithPlayerIdOverHundred() hinzu.

Ich wollte eigentlich vermeiden für jedes Selektionskriterium die Player-Klasse zu vergrößern.

gepostet vor 12 Jahre, 10 Monate von MrMaxx

Ich kann dir nur "guave" (vormals "google collections") empfehlen...zwar nicht ganz das was du gerne hättest, aber kommt dem immerhin halbwegs nahe. Zu diesem Thema entfehle ich als schnelle Lektüre:

Ein guter Überblick über die Funktionalität von guave bietet:

Hier ist für dich vermutlich der Block über "Predicates/Functions" am interessantesten.

So long...

Maxx

Auf diese Diskussion antworten