Streams

Création d’un Stream

Avec la méthode builder()

Stream<String> stringStream = Stream.<String>builder().add("Hello ").add("world").build();
System.out.println(stringStream.collect(Collectors.joining())); // Hello worldLangage du code : JavaScript (javascript)

A partir d’un Array

int[] tableau = { 1, 2, 3, 4 };
IntStream tableauStream = Arrays.stream(tableau);

A partir d’une liste avec la méthode Collection.stream()

List<String> liste = { "Annanas", "Pomme", "Fraise", "Poire" };
Stream<String> listeStream = list.stream();Langage du code : JavaScript (javascript)

A partir des lignes d’un fichier avec la méthode Files.lines()

Path fichier = Path.get("fichier.txt");
Stream<String> linesStream = Files.lines(fichier);Langage du code : JavaScript (javascript)

Interfaces filles de Stream pour certains types primitifs : IntStream, LongStream et DoubleStream

int [] intStreamRange = IntStream.range(0, 100).toArray(); // From 0 to 99
int [] intStreamRangeClosed = IntStream.rangeClosed(0, 100).toArray(); // From 0 to 100
int [] intStreamOf = IntStream.of(12,25,36,85,28,96,47).toArray(); // The order is preserved.
int [] intStreamOfAndSorted = IntStream.of(12,25,36,85,28,96,47).sorted().toArray(); // Sort Langage du code : PHP (php)

Parcourir un stream avec la méthode foreach()

Affiche les chiffres de 10 jusqu’à 0

IntStream.iterate(10, n->n-1).limit(11).forEach(System.out::println);Langage du code : CSS (css)

La Réduction: obtenir un résultat unique avec Stream.sum() et Stream.average()

IntStream.iterate(10, n->n-1).limit(11).forEach(System.out::println);Langage du code : CSS (css)

La collecte

La collecte avec la méthode Stream.collecte() et l’outil Collectors de l’interface Collector
Permet de créer une collection en fournissant une implémentation Collectors de Collector

List<String> liste = Arrays.asList("une chaine", "une autre chaine", "encore une chaine");
List<String> autreListe = liste.stream().collect(Collectors.toList());Langage du code : JavaScript (javascript)

Collectors.groupingBy()

Collectors.groupingBy() permet de créer un Map

List<Voiture> liste = Arrays.asList(new Voiture("citroen"),
                                    new Voiture("renault"),
                                    new Voiture("audi"),
                                    new Voiture("citroen"));

Map<String, List<Voiture>> map = liste.stream().collect(Collectors.groupingBy(Voiture::getMarque));

System.out.println(map.get("citroen").size()); // 2
System.out.println(map.get("renault").size()); // 1
System.out.println(map.get("audi").size());    // 1Langage du code : PHP (php)

Collectors.joining()

Collectors.joining() pour créer une chaîne de caractères

List<String> list = Arrays.asList("un", "deux", "trois", "quatre", "cinq");
String resultat = list.stream().collect(Collectors.joining(", "));

System.out.println(resultat); // "un, deux, trois, quatre, cinq"Langage du code : PHP (php)

Le filtrage

Stream.filter()

List<Voiture> liste = Arrays.asList(new Voiture("citroen"),
                                    new Voiture("audi"),
                                    new Voiture("citroen"));

// on construit la liste des voitures qui ne sont pas de marque "citroen"
List<Voiture> sansCitroen = liste.stream()
                                 .filter(v -> !v.getMarque().equals("citroen"))
                                 .collect(Collectors.toList());

System.out.println(sansCitroen.size()); // 1Langage du code : PHP (php)
// On affiche les 500 premiers nombres qui ne sont pas divisibles par 7
IntStream.iterate(1, n -> n + 1)
         .filter(n -> n % 7 != 0)
         .limit(500)
         .forEach(System.out::println);Langage du code : PHP (php)

Le mapping

Stream.map()

Méthode permettant de transformer chaque élément du flux pour passer d’un type à un autre

/**
Parcourir une liste de "Voiture" pour en extraire les marques et les collecter dans une liste de "String"
*/
List<Voiture> liste = Arrays.asList(new Voiture("citroen"),
                                    new Voiture("audi"),
                                    new Voiture("renault"),
                                    new Voiture("volkswagen"),
                                    new Voiture("citroen"));

// mapping du stream de voiture en stream de String
Set<String> marques = liste.stream()
                           .map(Voiture::getMarque)
                           .collect(Collectors.toSet());

System.out.println(marques); // ["audi", "citroen", "renault", "volkswagen"]Langage du code : PHP (php)

Stream.mapToInt, Stream.mapToLong, Stream.mapToDouble

Méthodes réaliser un mapping vers un type primitif

// Affichage de la racine carré des 100 premiers entiers
IntStream.range(1, 101)
         .mapToDouble(Math::sqrt)
         .forEach(System.out::println);Langage du code : PHP (php)

A voir également la méthode Stream.mapToObject()