Ich frage mich, warum Java keine Implementierung von Tupel-Datenstrukturen in seiner Standardbibliothek hat. Zum Beispiel hat C++ eine sehr gute Implementierung dieser fixierten Sammlung heterogener Werte. Das Gleiche gilt für Haskell. In Java kenne ich nur javatuples und einige Unterstützung in der Functional Java-Bibliothek über Product
(P1 - P8
) Typen. Ich frage mich, warum tuple
oder zumindest pair
überhaupt nicht in der Standardbibliothek enthalten sind? Sogar die Android SDK-Entwickler haben ihre eigene Implementierung von 2-Tupeln (Pairs) hinzugefügt.
Antworten
Zu viele Anzeigen?Der "Java-Weg" besteht darin, nutzerspezifische Klassen zu definieren, anstatt diese Arten von leichten halbklassenähnlichen Typen zu verwenden. Wenn man darüber nachdenkt, ist ein Tupel eigentlich nur eine vereinfachte Struktur; die Java-Entwickler würden es bevorzugen, dass du die Struktur einfach erstellst.
Diese Perspektive ändert sich ein wenig, insbesondere in Java 8 mit seinen Lambdas (die den JDK unter Druck setzen, generische Function
-Typ-Schnittstellen bereitzustellen, anstatt einsatzspezifische Schnittstellen wie FooCallback
zu verwenden). Aber es ist immer noch eine ziemlich starke Denkweise für viele Java-Entwickler, und es macht Sinn. Java ist eine sehr stark typisierte Sprache; ein Tupel liegt irgendwo zwischen statischer und dynamischer Typisierung, da im Typsystem nichts vorhanden ist, um dich davon abzuhalten zu denken, dass dieses (int, String)
, das eine Kunden-ID und Name darstellt, tatsächlich ein (int, String)
repräsentiert, das eine Auftrags-ID und dessen Beschreibung darstellt.
Siehe dazu beispielsweise diese Diskussion ("Tupel für n >= 2") zum Thema innerhalb des Guava-Projekts. Zugegeben, das ist nicht offiziell; aber es ist eine gute Darstellung der Java-Denkweise.
Es gibt eine schöne Bibliothek namens javatuples
. Es definiert generische Tupeltypen für Aritäten von 1 (Unit
) bis 10 (Decade
) und alle wesentlichen Methoden wie equals
, hashCode
, toString
und sogar compareTo
.
Offizielle Website: http://www.javatuples.org/
Maven-Abhängigkeit:
org.javatuples
javatuples
[version]
compile
(derzeit ist die neueste Version 1.2
)
Es hat:
Collections.unmodifiableList(deineListe)
wird die Arbeit erledigen.
Ich denke, dass die Vielseitigkeit des JCF das Vorhandensein expliziter Tupel-Datentypen unnötig macht.
Ich nehme an, dass mit <em>Tupel</em> eine geordnete unveränderliche Liste von Elementen gemeint ist (gemäß der <a href="http://en.wikipedia.org/wiki/Tuple" rel="nofollow noreferrer">Wikipedia-Definition</a>).
Was die Bibliothek von Drittanbietern betrifft, hat meine Suche mit Google dies, dies und natürlich dies ergeben.
Es gibt einen Typ in der Java Laufzeit und er heißt Entry. Dies ist eine Schnittstelle innerhalb von Map und es gibt einfache Implementierungen davon innerhalb von AbstractMap.
http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html
http://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.SimpleEntry.html
Sie können es als Tupel für zwei Elemente verwenden, Sie können sogar Generics anwenden. Ich würde hart nachdenken, was ich falsch gemacht habe, wenn ich jemals mehr als zwei Elemente benötigen würde. Wahrscheinlich lohnt es sich dann, eine eigene Klasse zu erstellen.
Ein Kollege und ich haben das vor ein paar Wochen diskutiert. Die einzige Lösung, die mir eingefallen ist, war, die Werte intern in einer Map
zu speichern und eine Methode zum Abrufen zu haben getValue(Class)
. Andernfalls, wie greifen Sie auf die Werte in Ihrem Tupel zu? Sie können keine generische Tuple
-Klasse mit Methoden für jedes Mitglied haben, z. B. getInteger
, getString
, etc., da diese Methoden bis zum Zeitpunkt der Ausführung nicht bekannt wären, wenn Sie das Tupel erstellen. Dies bedeutet auch, dass Sie nie zwei Mitglieder mit demselben Typ haben könnten - wie würden Sie eine solche Klasse schreiben, damit sie zur Laufzeit wüsste, welches Objekt sie abrufen soll?
- See previous answers
- Weitere Antworten anzeigen