Ich brauche eine Kartenfunktion . Gibt es so etwas schon in Java?
(Für diejenigen, die sich fragen: Ich weiß natürlich, wie man diese triviale Funktion selbst implementiert ...)
java
map-function
Albert
quelle
quelle
Antworten:
Es gibt keine Vorstellung von einer Funktion im JDK ab Java 6.
Guava verfügt jedoch über eine Funktionsschnittstelle und die Methode bietet die von Ihnen benötigte Funktionalität.
Collections2.transform(Collection<E>, Function<E,E2>)
Beispiel:
Ausgabe:
Heutzutage gibt es mit Java 8 tatsächlich eine Kartenfunktion, daher würde ich den Code wahrscheinlich präziser schreiben:
quelle
Collections2.transform(input -> Integer.toHexString(intput.intValue())
Seit Java 8 gibt es einige Standardoptionen, um dies in JDK zu tun:
Siehe
java.util.Collection.stream()
undjava.util.stream.Collectors.toList()
.quelle
toList()
. Ersetzen auf einen anderen Typ:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
durch nur ersetzt werdendoMap
?foo::doMap
oderFoo::doMap
.Es gibt eine wunderbare Bibliothek namens Functional Java, die viele der Dinge behandelt, die Java haben soll, aber nicht. Andererseits gibt es auch diese wunderbare Sprache Scala, die alles tut, was Java hätte tun sollen, aber nicht mit allem kompatibel ist, was für die JVM geschrieben wurde.
quelle
a.map({int i => i + 42});
Haben sie den Compiler erweitert? oder Präprozessor hinzugefügt?Seien Sie sehr vorsichtig mit
Collections2.transform()
Guaven. Der größte Vorteil dieser Methode ist auch ihre größte Gefahr: ihre Faulheit.Schauen Sie sich die Dokumentation an
Lists.transform()
, von der ich glaube, dass sie auch gilt fürCollections2.transform()
:Auch in der Dokumentation wird
Collections2.transform()
erwähnt, dass Sie eine Live-Ansicht erhalten, die sich in der Quellliste auf die transformierte Liste auswirkt. Diese Art von Verhalten kann zu schwer zu verfolgenden Problemen führen, wenn der Entwickler nicht erkennt, wie es funktioniert.Wenn Sie eine klassischere "Karte" möchten, die nur einmal ausgeführt wird, sind Sie besser dran
FluentIterable
, auch von Guava aus, die eine viel einfachere Operation hat. Hier ist das Google-Beispiel dafür:transform()
Hier ist die Kartenmethode. Es verwendet die gleiche Funktion <> "Rückrufe" wieCollections.transform()
. Die Liste, die Sie zurückerhalten, ist schreibgeschützt. Verwenden Sie diese Option,copyInto()
um eine Lese- / Schreibliste abzurufen.Andernfalls ist dies natürlich veraltet, wenn Java8 mit Lambdas herauskommt.
quelle
Dies ist eine weitere funktionale Bibliothek, mit der Sie map verwenden können: http://code.google.com/p/totallylazy/
quelle
Obwohl es eine alte Frage ist, möchte ich eine andere Lösung zeigen:
Definieren Sie einfach Ihre eigene Operation mit Java Generics und Java 8 Streams:
Dann können Sie Code wie folgt schreiben:
quelle