Funktionale Java - Transformation durch Aufrufen einer Mitgliedsfunktion
-
25-10-2019 - |
Frage
Ich komme aus rublicher Sicht auf eine funktionale Java
In Ruby können Sie so etwas tun
mapped_array = [1,2,3].map(&:to_s)
Dies bewertet das Array durch Aufrufen der TO_S -Mitgliedsfunktion in jedem Objekt aus (Karte)
mapped_array = []
[1,2,3].each { |e| mapped_array << e.to_s }
Ich würde gerne etwas Ähnliches in Java tun, nämlich eine Liste von Produkt-3 (FJ.P3), indem ich die Methode _2 () für jedes Objekt aufruft
List<P2<Integer, Double>> aListOfP2;
final List<Double> costs = transform(aListOfP2, Converters.<Integer, Double>second());
Also musste ich irgendwo eine Methode definieren
public static final <A,B> Function<P2<A,B>,B> second() {
return new Function<P2<A, B>, B>() {
public B apply(final P2<A, B> from) {
return from._2();
}
};
};
Aber wenn ich dann das erste Element bekommen möchte, ist das eine andere Methode ... Wenn ich das zweite Element von einem P3 erhalten möchte, ist das eine andere Methode.
Frage ist ... Wenn es keinen Mechanismus gibt, wie es in Ruby verfügbar ist, wie gut ist es der allgemeinste Weg, dies zu erreichen?
Lösung
Sie sollten sich auschecken __2(), wie in zwei Unterstrichen.
Also würde deine Linie werden:
List<P2<Integer, Double>> aListOfP2;
final List<Double> costs = transform(aListOfP2, P2.<Integer, Double>__2());
Oder Sie könnten so etwas verwenden wie
final List<Double> costs = aListOfP2.map(P2.__2()).map(transform);