MISE À JOUR: Cette réponse est en réponse à la question initiale, Java SE 8 a-t-il des paires ou des tuples? (Et implicitement, sinon, pourquoi?) L'OP a mis à jour la question avec un exemple plus complet, mais il semble que cela puisse être résolu sans utiliser aucun type de structure Pair. [Note d'OP: voici l'autre bonne réponse .]
La réponse courte est non. Vous devez soit lancer le vôtre, soit apporter l'une des nombreuses bibliothèques qui l'implémentent.
Avoir une Pair
classe en Java SE a été proposé et rejeté au moins une fois. Consultez ce fil de discussion sur l'une des listes de diffusion OpenJDK. Les compromis ne sont pas évidents. D'une part, il existe de nombreuses implémentations Pair dans d'autres bibliothèques et dans le code d'application. Cela démontre un besoin, et l'ajout d'une telle classe à Java SE augmentera la réutilisation et le partage. D'un autre côté, avoir une classe Pair ajoute à la tentation de créer des structures de données compliquées à partir de paires et de collections sans créer les types et abstractions nécessaires. (C'est une paraphrase du message de Kevin Bourillion à partir de ce fil.)
Je recommande à tout le monde de lire l'intégralité de ce fil de discussion. C'est remarquablement perspicace et n'a pas de flamage. C'est assez convaincant. Quand il a commencé, j'ai pensé, "Ouais, il devrait y avoir une classe Pair dans Java SE" mais au moment où le thread a atteint sa fin, j'avais changé d'avis.
Notez cependant que JavaFX a la classe javafx.util.Pair . Les API JavaFX ont évolué séparément des API Java SE.
Comme on peut le voir dans la question liée Quel est l'équivalent de la paire C ++ en Java?il y a un espace de conception assez grand autour de ce qui est apparemment une API si simple. Les objets doivent-ils être immuables? Devraient-ils être sérialisables? Devraient-ils être comparables? Le cours doit-il être final ou non? Faut-il ordonner les deux éléments? Doit-il être une interface ou une classe? Pourquoi s'arrêter aux paires? Pourquoi pas des triples, des quads ou des N-tuples?
Et bien sûr, il y a l'inévitable dénomination bikeshed pour les éléments:
- (un B)
- (première seconde)
- (gauche droite)
- (voiture, cdr)
- (toto, bar)
- etc.
Un gros problème qui a à peine été mentionné est la relation des paires avec les primitifs. Si vous avez une (int x, int y)
donnée qui représente un point dans l'espace 2D, la représenter comme Pair<Integer, Integer>
consomme trois objets au lieu de deux mots de 32 bits. En outre, ces objets doivent résider sur le tas et entraîneront une surcharge GC.
Il semblerait clair que, comme les Streams, il serait essentiel qu'il y ait des spécialisations primitives pour les Paires. Voulons-nous voir:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
Même un IntIntPair
nécessiterait toujours un objet sur le tas.
Celles-ci rappellent bien sûr la prolifération des interfaces fonctionnelles dans le java.util.function
package de Java SE 8. Si vous ne voulez pas d'une API surchargée, lesquelles laisseriez-vous de côté? Vous pourriez également soutenir que cela ne suffit pas et que des spécialisations, par exemple, Boolean
devraient également être ajoutées.
Mon sentiment est que si Java avait ajouté une classe Pair il y a longtemps, cela aurait été simple, voire simpliste, et cela n'aurait pas satisfait la plupart des cas d'utilisation que nous envisageons actuellement. Considérez que si Pair avait été ajouté dans la période de temps JDK 1.0, il aurait probablement été mutable! (Regardez java.util.Date.) Est-ce que les gens auraient été satisfaits de cela? Je suppose que s'il y avait une classe Pair en Java, ce ne serait pas vraiment utile et tout le monde roulera toujours la sienne pour satisfaire ses besoins, il y aurait diverses implémentations Pair et Tuple dans des bibliothèques externes, et les gens continueraient à se disputer / discuter de la manière de réparer la classe Pair de Java. En d'autres termes, un peu au même endroit où nous en sommes aujourd'hui.
Pendant ce temps, des travaux sont en cours pour résoudre le problème fondamental, qui est une meilleure prise en charge dans la JVM (et éventuellement le langage Java) pour les types valeur . Consultez ce document sur l' état des valeurs . Il s'agit d'un travail préliminaire et spéculatif, et il ne couvre que les problèmes du point de vue de la JVM, mais il a déjà beaucoup de réflexion derrière cela. Bien sûr, il n'y a aucune garantie que cela entrera dans Java 9, ou jamais n'importe où, mais cela montre la direction actuelle de la réflexion sur ce sujet.
AbstractMap.SimpleImmutableEntry<K,V>
depuis des années ... Mais de toute façon, au lieu de la cartographiei
à(i, value[i])
juste pour filtrer parvalue[i]
et cartographie Retour ài
: pourquoi ne pas simplement filtrer parvalue[i]
en premier lieu, sans la mise en correspondance?