Nouveaux collecteurs de flux en Java 9

Nouveaux collecteurs de flux en Java 9

1. Vue d'ensemble

Collectors ont été ajoutés dans Java 8, ce qui a aidé à accumuler des éléments d'entrée dans des conteneurs mutables tels queMap,List etSet.

Dans cet article, nous allons explorer lestwo new collectors added in Java 9: Collectors.filtering andCollectors.flatMapping utilisés en combinaison avecCollectors.groupingBy fournissant des collections intelligentes d'éléments.

2. Filtering Collector

LeCollectors.filtering est similaire auStream filter(); il est utilisé pour les éléments d'entrée defiltering mais utilisé pour différents scénarios. LeStream’sfilter est utilisé dans la chaîne de flux tandis que lefiltering est unCollector qui a été conçu pour être utilisé avecgroupingBy.

AvecStream’sfilter, les valeurs sont d'abord filtrées, puis regroupées. De cette façon, les valeurs filtrées ont disparu et il n’y en a aucune trace. Si nous avons besoin d'une trace, nous aurions besoin de grouper d'abord, puis d'appliquer le filtrage, ce que fait réellement lesCollectors.filtering.

LeCollectors.filtering prend une fonction de filtrage des éléments d'entrée et un collecteur pour collecter les éléments filtrés:

@Test
public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() {
    List numbers = List.of(1, 2, 3, 5, 5);

    Map result = numbers.stream()
      .filter(val -> val > 3)
      .collect(Collectors.groupingBy(i -> i, Collectors.counting()));

    assertEquals(1, result.size());

    result = numbers.stream()
      .collect(Collectors.groupingBy(i -> i,
        Collectors.filtering(val -> val > 3, Collectors.counting())));

    assertEquals(4, result.size());
}

3. FlatMapping Collector

LeCollectors.flatMapping est similaire àCollectors.mapping mais a un objectif plus fin. Les deux collecteurs prennent une fonction et un collecteur où les éléments sont collectés mais la fonctionflatMapping accepte unStream d'éléments qui est ensuite accumulé par le collecteur.

Voyons la classe de modèle suivante:

class Blog {
    private String authorName;
    private List comments;

    // constructor and getters
}

Collectors.flatMapping nous permet d'ignorer la collection intermédiaire et d'écrire directement dans un seul conteneur qui est mappé à ce groupe défini par lesCollectors.groupingBy:

@Test
public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() {
    Blog blog1 = new Blog("1", "Nice", "Very Nice");
    Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better");
    List blogs = List.of(blog1, blog2);

    Map>> authorComments1 = blogs.stream()
     .collect(Collectors.groupingBy(Blog::getAuthorName,
       Collectors.mapping(Blog::getComments, Collectors.toList())));

    assertEquals(2, authorComments1.size());
    assertEquals(2, authorComments1.get("1").get(0).size());
    assertEquals(3, authorComments1.get("2").get(0).size());

    Map> authorComments2 = blogs.stream()
      .collect(Collectors.groupingBy(Blog::getAuthorName,
        Collectors.flatMapping(blog -> blog.getComments().stream(),
        Collectors.toList())));

    assertEquals(2, authorComments2.size());
    assertEquals(2, authorComments2.get("1").size());
    assertEquals(3, authorComments2.get("2").size());
}

LeCollectors.mapping mappe tous les commentaires des auteurs groupés au conteneur du collecteur, c'est-à-dire List alors que cette collection intermédiaire est supprimée avecflatMapping car elle donne un flux direct de la liste de commentaires à mapper sur le conteneur du collecteur.

4. Conclusion

Cet article illustre l'utilisation des nouveauxCollectors introduits dansJava9 i.e. Collectors.filtering() and Collectors.flatMapping() used in combination with Collectors.groupingBy().

Ces collecteurs peuvent également être utilisés avecCollectors.partitioningBy(), mais cela ne crée que deux partitions en fonction des conditions et la puissance réelle des collecteurs n’est pas exploitée; donc laissé en dehors de ce tutoriel.

Le code source complet des extraits de code de ce didacticiel est disponibleover on GitHub.