UPDATE: Diese Antwort ist eine Antwort auf die ursprüngliche Frage: Hat Java SE 8 Paare oder Tupel? (Und implizit, wenn nicht, warum nicht?) Das OP hat die Frage mit einem vollständigeren Beispiel aktualisiert, aber es scheint, dass sie ohne Verwendung einer Paarstruktur gelöst werden kann. [Anmerkung von OP: Hier ist die andere richtige Antwort .]
Die kurze Antwort lautet nein. Sie müssen entweder Ihre eigenen rollen oder eine der mehreren Bibliotheken einbinden, die sie implementieren.
Eine Pair
Klasse in Java SE zu haben, wurde mindestens einmal vorgeschlagen und abgelehnt. Siehe diesen Diskussionsthread auf einer der OpenJDK-Mailinglisten. Die Kompromisse sind nicht offensichtlich. Einerseits gibt es viele Paarimplementierungen in anderen Bibliotheken und im Anwendungscode. Dies zeigt einen Bedarf, und das Hinzufügen einer solchen Klasse zu Java SE erhöht die Wiederverwendung und Freigabe. Andererseits erhöht die Verwendung einer Pair-Klasse die Versuchung, komplizierte Datenstrukturen aus Paaren und Sammlungen zu erstellen, ohne die erforderlichen Typen und Abstraktionen zu erstellen. (Das ist eine Umschreibung von Kevin Bourillions Botschaft aus diesem Thread.)
Ich empfehle jedem, den gesamten E-Mail-Thread zu lesen. Es ist bemerkenswert aufschlussreich und hat keine Flammen. Es ist ziemlich überzeugend. Als es anfing, dachte ich: "Ja, es sollte eine Pair-Klasse in Java SE geben", aber als der Thread sein Ende erreichte, hatte ich meine Meinung geändert.
Beachten Sie jedoch, dass JavaFX das javafx.util.Pair hat Klasse . Die APIs von JavaFX wurden getrennt von den Java SE-APIs entwickelt.
Wie aus der verknüpften Frage hervorgeht, entspricht das C ++ - Paar in Java?Es gibt einen ziemlich großen Designraum, der eine scheinbar so einfache API umgibt. Sollten die Objekte unveränderlich sein? Sollten sie serialisierbar sein? Sollten sie vergleichbar sein? Sollte die Klasse endgültig sein oder nicht? Sollten die beiden Elemente bestellt werden? Sollte es eine Schnittstelle oder eine Klasse sein? Warum bei Paaren anhalten? Warum nicht Tripel, Quads oder N-Tupel?
Und natürlich gibt es die unvermeidliche Namensgebung für die Elemente:
- (a, b)
- (erste Sekunde)
- (links rechts)
- (Auto, CDR)
- (foo, bar)
- etc.
Ein großes Problem, das kaum erwähnt wurde, ist das Verhältnis von Paaren zu Primitiven. Wenn Sie ein (int x, int y)
Datum haben, das einen Punkt im 2D-Raum darstellt, Pair<Integer, Integer>
verbraucht dies drei Objekte anstelle von zwei 32-Bit-Wörtern. Darüber hinaus müssen sich diese Objekte auf dem Heap befinden und verursachen GC-Overhead.
Es scheint klar zu sein, dass es wie bei Streams wesentlich ist, dass es primitive Spezialisierungen für Paare gibt. Wollen wir sehen:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
Sogar ein IntIntPair
würde noch ein Objekt auf dem Haufen benötigen.
Diese erinnern natürlich an die Verbreitung funktionaler Schnittstellen im java.util.function
Paket in Java SE 8. Wenn Sie keine aufgeblähte API möchten, welche würden Sie weglassen? Sie könnten auch argumentieren, dass dies nicht ausreicht und dass beispielsweise auch Spezialisierungen Boolean
hinzugefügt werden sollten.
Ich habe das Gefühl, dass Java, wenn es vor langer Zeit eine Pair-Klasse hinzugefügt hätte, einfach oder sogar simpel gewesen wäre und viele der Anwendungsfälle, die wir uns jetzt vorstellen, nicht erfüllt hätte. Wenn Pair im Zeitrahmen von JDK 1.0 hinzugefügt worden wäre, wäre es wahrscheinlich veränderlich gewesen! (Schauen Sie sich java.util.Date an.) Wären die Leute damit zufrieden gewesen? Ich vermute, wenn es eine Pair-Klasse in Java gäbe, wäre sie irgendwie nicht wirklich nützlich, und jeder wird immer noch seine eigenen rollen, um seine Anforderungen zu erfüllen. Es würde verschiedene Pair- und Tuple-Implementierungen in externen Bibliotheken geben. und die Leute würden immer noch darüber streiten / diskutieren, wie Javas Pair-Klasse repariert werden kann. Mit anderen Worten, irgendwie an dem Ort, an dem wir uns heute befinden.
Inzwischen wird einige Arbeit auf die grundlegende Frage anzusprechen, die eine bessere Unterstützung in der JVM ist (und schließlich die Java - Sprache) für Werttypen . Siehe dieses Dokument zum Status der Werte . Dies ist eine vorläufige, spekulative Arbeit, die nur Themen aus der Sicht der JVM abdeckt, aber bereits einiges an Gedanken hinter sich hat. Natürlich gibt es keine Garantie dafür, dass dies in Java 9 oder jemals irgendwohin gelangt, aber es zeigt die aktuelle Denkrichtung zu diesem Thema.
AbstractMap.SimpleImmutableEntry<K,V>
seit Jahren ... Aber wie auch immer, statt Zuordnungi
zu(i, value[i])
nur zum Filtern vonvalue[i]
und Mapping zurück zui
: warum Filter nicht nur vonvalue[i]
in erster Linie, ohne die Zuordnung?