0Pricing
Java Academy · Leçon

Spliterator : division pour le parallélisme

Implémentez un Spliterator personnalisé pour exposer les données métier comme source de flux divisible.

Spliterator : division pour le parallélisme est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Qu’est-ce qu’un Spliterator ?

Un Spliterator (itérateur partitionnable) est le mécanisme central des flux. Il parcourt les éléments et peut se diviser en deux parties pour permettre le traitement parallèle.

Méthodes clés de Spliterator

Quatre méthodes principales : tryAdvance (traiter un élément), forEachRemaining (traiter tous les éléments restants), trySplit (diviser en deux), estimateSize (estimation du nombre d’éléments).

Spliterator<Integer> sp = List.of(1,2,3,4,5,6).spliterator();
Spliterator<Integer> half = sp.trySplit(); // splits off first ~half
half.forEachRemaining(System.out::println); // 1 2 3
sp.forEachRemaining(System.out::println);   // 4 5 6

Caractéristiques de Spliterator

Les Spliterator déclarent leurs caractéristiques au moyen d’indicateurs de bits : SIZED, ORDERED, DISTINCT, SORTED, NONNULL, IMMUTABLE, CONCURRENT, SUBSIZED.

Spliterator<String> sp = List.of("a","b","c").spliterator();
System.out.println(Integer.toBinaryString(sp.characteristics()));
// Characteristics include ORDERED, SIZED, SUBSIZED

Fonctionnement de trySplit

trySplit() renvoie un nouveau Spliterator couvrant approximativement la moitié des éléments restants. L’original couvre l’autre moitié. Renvoyez null si le partitionnement est impossible.

// ArrayList Spliterator splits efficiently at midpoint:
// [0,1,2,3,4,5] -> [0,1,2] (new) + [3,4,5] (original)

Créer un Spliterator personnalisé

Implémentez Spliterator<T> pour exposer une structure de données personnalisée comme source de flux. Définissez trySplit afin d’activer le parallélisme.

public class RangeSpliterator implements Spliterator<Integer> {
    private int start, end;
    public RangeSpliterator(int start, int end) { this.start=start; this.end=end; }
    public boolean tryAdvance(Consumer<? super Integer> action) {
        if (start >= end) return false;
        action.accept(start++); return true;
    }
    public Spliterator<Integer> trySplit() {
        int mid = (start + end) / 2;
        if (mid <= start) return null;
        RangeSpliterator prefix = new RangeSpliterator(start, mid);
        this.start = mid; return prefix;
    }
    public long estimateSize() { return end - start; }
    public int characteristics() { return ORDERED | SIZED | SUBSIZED | IMMUTABLE; }
}

Créer un flux à partir d’un Spliterator

Utilisez StreamSupport.stream(spliterator, parallel) pour créer un flux à partir de n’importe quel Spliterator — le pont entre les sources de données personnalisées et l’API des flux.

Spliterator<Integer> sp = new RangeSpliterator(0, 1_000_000);
Stream<Integer> stream = StreamSupport.stream(sp, true); // true = parallel
long count = stream.filter(n -> n % 2 == 0).count();
System.out.println(count); // 500000

Spliterator pour un arbre binaire

Les Spliterator personnalisés permettent le parallélisme sur des structures autres que des listes, comme les arbres. trySplit renvoie le Spliterator du sous-arbre gauche et conserve le droit.

Efficacité du parallélisme et qualité du partitionnement

Les flux parallèles partitionnent récursivement les données jusqu’à ce que les blocs soient assez petits pour un seul fil d’exécution. Un bon partitionnement exige que estimateSize soit précis et que les partitions soient à peu près égales.

forEachRemaining pour le traitement en bloc

Si aucun partitionnement n’est nécessaire, redéfinissez forEachRemaining pour effectuer un traitement en bloc qui évite le surcoût par élément de tryAdvance dans une boucle.

@Override
public void forEachRemaining(Consumer<? super Integer> action) {
    for (int i = start; i < end; i++) action.accept(i);
    start = end; // mark as exhausted
}

Spliterator ou itérateur

Itérateur : uniquement séquentiel, sans indication de taille ni partitionnement. Spliterator : compatible avec le parallélisme, fournit des caractéristiques et une estimation de la taille, et est conçu pour l’API des flux.

Vérification rapide

Que renvoie trySplit() lorsque le partitionnement est impossible ?

Récapitulatif

Spliterator est le moteur des flux parallèles. Implémentez tryAdvance, trySplit, estimateSize et characteristics pour exposer des structures de données personnalisées sous forme de flux. Utilisez StreamSupport.stream(sp, true) pour activer le parallélisme.

Questions Fréquemment Posées

La leçon « Spliterator : division pour le parallélisme » est-elle gratuite ?

Oui — le texte complet de « Spliterator : division pour le parallélisme » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Spliterator : division pour le parallélisme » ?

Implémentez un Spliterator personnalisé pour exposer les données métier comme source de flux divisible. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Spliterator : division pour le parallélisme » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. flatMap pour les collections imbriquées
  2. Flux parallèles : performances et pièges
  3. Spliterator : division pour le parallélisme
  4. Flux infinis avec iterate et generate
← Retour à Java Academy