La classe
EmbedList dans le package
fr.uge.embed est une liste pour laquelle les maillons
sont fournis par l'utilisateur et embarqués (
embedded in English) dans la liste.
On crée une
EmbedList en fournissant deux fonctions, une fonction
getNext qui renvoie
le maillon suivant (ou
null) et une fonction
setNext qui change la valeur du maillon suivant.
L'idée est que l'utilisateur fournit une classe (un maillon) qui implante ces deux fonctions et la classe
EmbedList va s'occuper de gérer le chaînage pour l'utilisateur.
On présupposera que l'utilisateur ne changera
jamais le chaînage
(changer la valeur du champ nommé
next dans l'exemple ci-dessous)
par lui-même et utilisera toujours les méthodes de la classe
EmbedList à la place.
Comparée à une implantation classique de liste chaînée comme
LinkedList,
les valeurs stockées dans les maillons ne sont pas gérées par l'implantation de liste, mais par l'utilisateur
ce qui est plus efficace s'il y a plusieurs valeurs ou si la valeur est un type primitif
(car il n'est pas nécessaire de
boxer la valeur).
Voici un exemple d'utilisation de
EmbedList.
Dans un premier temps, l'utilisateur définit une classe maillon :
class Node {
private Node next;
private final int value;
Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node" + value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
avec une méthode qui renvoie le maillon suivant (ici
getNext)
et une méthode qui modifie le maillon suivant (ici
setNext).
La classe
EmbedList, en plus du constructeur, possède une méthode
size
qui renvoie le nombre de maillons de la liste ainsi qu'une méthode
addFirst
qui permet d'ajouter un maillon en tête de liste.
EmbedList<Node> list = new EmbedList<Node>(Node::getNext, Node::setNext);
list.addFirst(new Node(1));
list.addFirst(new Node(2));
list.addFirst(new Node(3));
System.out.println(list.size()); // 3
System.out.println(list); // [Node3, Node2, Node1]
En plus des méthodes
size et
addFirst, la classe
EmbedList
-
définit une méthode forEach(lambda) qui appelle la lambda avec chaque maillon
-
peut être parcourue en utilisant la syntaxe for(var maillon: embedList) { ... }
-
définit une méthode get(index) qui renvoie le index-ième maillon
-
définit une méthode unmodifiable qui renvoie une nouvelle liste qui partage les mêmes
maillons que la liste originale et est non modifiable.
-
définit une méthode add(maillon) qui permet d'ajouter un maillon en fin de liste.
-
définit une méthode valueStream(lambda) qui renvoie un Stream des valeurs des maillons
obtenus en appliquant la lambda prise en paramètre pour chaque maillon.