L’interface SequencedMap
est une interface spécialisée conçue pour les Map
dont les clés, les valeurs et les entrées ont un ordre de parcours défini tout comme LinkedHashMap
, qui introduit une nouvelle approche de la gestion des données ordonnées dans les Maps.
L’interface SequencedMap<K, V>
hérite de l’interface Map<K, V>
et fournit des méthodes pour accéder à ses entrées et les manipuler en fonction de leur ordre de parcours.
Elle propose des méthodes pour manipuler les entrées d’une Map en tenant compte de leur ordre d’accès :
-
Map.Entry<K, V> firstEntry()
: renvoyer la première entrée de la Map
-
Map.Entry<K, V> lastEntry()
: renvoyer la dernière entrée de la Map
-
Map.Entry<K, V> pollFirstEntry()
: supprimer et renvoyer la première entrée de la Map
-
Map.Entry<K, V> pollLastEntry()
: supprimer et renvoyer la dernière entrée de la Map
-
Map.Entry<K, V> putFirst(K k, V v)
: insérer une entrée au début de la Map
-
Map.Entry<K, V> putLast(K k, V v)
: insérer une entrée à la fin de la Map
-
SequencedMap<K,V> reversed()
: obtenir une vue inversée de la Map
-
SequencedSet<Map.Entry<K,V>> sequencedEntrySet()
: renvoyer un SequencedSet des entrées de la Map, en conservant l’ordre de parcours
-
SequencedSet<K> sequencedKeySet()
: renvoyer un SequencedSet des clés de la Map, en conservant l’ordre de parcours
-
SequencedCollection<V> sequencedValues()
: renvoyer une SequencedCollection des valeurs Map, en conservant l’ordre de parcours
Toutes les méthodes, à l’exception de reversed()
, sont des méthodes par défaut et fournissent donc une implémentation par défaut.
Les objets retournés par les méthodes firstEntry()
, lastEntry()
, pollFirstEntry()
et pollLastEntry()
de l’interface SequencedMap
ne prennent pas en charge la mutation de la Map sous-jacente en utilisant leur méthode optionnelle setValue()
. L’invocation de la méthode setValue()
dans ce contexte lève une exception de type UnsupportedOperationException
.
package fr.sciam.jav21.sequenced_collection;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
public class MainSequencedCollection {
public static void main(String[] args) {
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(1, "Valeur1");
map.put(2, "Valeur2");
map.put(3, "Valeur3");
Entry<Integer, String> entry = map.firstEntry();
entry.setValue("Valeur1 modifiee");
}
}
L’exécution du code affiche :
Exception in thread "main" java.lang.UnsupportedOperationException: not supported
at java.base/jdk.internal.util.NullableKeyValueHolder.setValue(NullableKeyValueHolder.java:126)
at fr.sciam.java21.sequenced_collection.TestSequencedCollection.main(TestSequencedCollection.java:20)
Ce type de modification est cependant toujours possible en utilisant un Iterator
.
Les méthodes putXxx(K, V)
ont une sémantique particulière, similaire aux méthodes addXxx(E)
correspondantes de SequencedSet
: pour les Maps telles que LinkedHashMap
, elles ont pour effet supplémentaire de repositionner l’entrée si elle est déjà présente dans la Map
. Pour des instances de type SortedMap
, ces méthodes lèvent une exception de type UnsupportedOperationException
.
Les méthodes putLast()
et putFirst()
, qui sont supportées par LinkedHashMap
, ne le sont pas par SortedMap
, pour les mêmes raisons que par SortedSet
.
Comme pour l’interface SequencedCollection
, les méthodes putXxx()
lèvent une exception de type UnsupportedOperationException
pour les Maps non modifiables ou les Maps dont l’ordre de tri est déjà défini. L’invocation de l’une des méthodes promues à partir de NavigableMap
sur une Map
vide lève une exception de type NoSuchElementException
.
Plusieurs méthodes permettent de faciliter le parcours des éléments :
-
SequencedMap<K,V> reversed()
:
-
SequencedSet<K> sequencedKeySet()
;
-
SequencedCollection<V> sequencedValues()
;
-
SequencedSet<Entry<K,V>> sequencedEntrySet()
;
L’ensemble des clés et l’ensemble des entrées sont désormais des SequencedSet
, et les méthodes s’appellent sequencedKeySet()
et sequencedEntrySet()
, mais ce sont toujours des vues sur le contenu de la Map
.
Les vues fournies par les méthodes keySet()
, values()
, entrySet()
, sequencedKeySet()
, sequencedValues()
et sequencedEntrySet()
reflètent toutes le même ordre de parcours des éléments. La différence est que les valeurs de retour des méthodes sequencedKeySet()
, sequencedValues()
et sequencedEntrySet()
sont des types séquencés.
La méthode reversed()
renvoie une vue inversée de la Map.
Les vues SequencedMap.sequencedKeySet().reversed()
et SequencedMap.reversed().sequencedKeySet()
sont fonctionnellement équivalentes.
Les méthodes sequencedKeySet()
, sequencedValues()
et sequencedEntrySet()
sont analogues aux méthodes keySet()
, values()
et entrySet()
de l’interface Map
. Toutes ces méthodes renvoient des vues de la collection sous-jacente, les modifications apportées à la vue étant visibles dans la collection sous-jacente et vice versa. L’ordre de parcours de ces vues correspond à l’ordre de parcours de la Map
sous-jacente.
La différence entre les méthodes de l’interface SequencedMap
et les méthodes de Map
est que les méthodes sequencedXxx()
ont un type de retour sous la forme d’une collection séquencée.
L’implémentation de la méthode sequencedKeySet()
renvoie une vue de type SequencedSet de l’ensemble de clés de la Map et se comporte comme suit :
-
Les méthodes add()
et addAll()
lèvent une exception de type UnsupportedOperationException
-
La méthode reversed()
renvoie une vue inversée de la Map de type SequencedKeySet
-
Les autres méthodes invoquent les méthodes correspondantes de la vue keySet
de la Map
L’implémentation de la méthode sequencedValues()
retourne une vue de type SequencedCollection<V>
des valeurs de la Map et se comporte comme suit :
-
Les méthodes add()
et addAll()
lèvent une exception de type UnsupportedOperationException
-
La méthode reversed()
renvoie une vue inversée des valeurs de la Map
-
Les autres méthodes invoquent les méthodes correspondantes de la vue des valeurs de la Map
L’implémentation de la méthode sequencedEntrySet()
retourne une vue de type SequencedSet<Entry>
des entrées de la Map
et se comporte comme suit :
-
Les méthodes add()
et addAll()
lèvent une exception de type UnsupportedOperationException
-
La méthode reversed()
renvoie la vue inversée des entrées de la Map
-
Les autres méthodes invoquent les méthodes correspondantes de la vue entrySet
de la Map
package fr.sciam.java21.sequenced_collection;
import java.util.LinkedHashMap;
import java.util.Map;
public class MainSequencedCollection {
public static void main(String[] args) {
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(1, "Valeur1");
map.put(2, "Valeur2");
map.put(3, "Valeur3");
System.out.println(map);
System.out.println(map.firstEntry());
System.out.println(map.lastEntry());
Map.Entry<Integer, String> premier = map.pollFirstEntry();
Map.Entry<Integer, String> dernier = map.pollLastEntry();
System.out.println("\n"+premier);
System.out.println(dernier);
System.out.println(map);
map.putFirst(1, "Valeur1");
map.putLast(3, "Valeur3");
System.out.println("\n"+map);
System.out.println("\n"+map.reversed());
}
}
L’exécution du code affiche :
{1=Valeur1, 2=Valeur2, 3=Valeur3}
1=Valeur1
3=Valeur3
1=Valeur1
3=Valeur3
{2=Valeur2}
{1=Valeur1, 2=Valeur2, 3=Valeur3}
{3=Valeur3, 2=Valeur2, 1=Valeur1}