web-dev-qa-db-fra.com

Comment partitionner une liste par prédicat en utilisant Java8?

J'ai une liste a que je veux diviser en quelques petites listes.

dites tous les éléments qui contiennent avec "aaa", tout ce qui contient avec "bbb" et quelques autres prédicats.

Comment puis-je le faire en utilisant Java8?

J'ai vu cela post mais il ne se divise qu'en 2 listes.

public void partition_list_Java8() {

    Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s");

    Map<Boolean, List<String>> decisionsByS = playerDecisions.stream()
            .collect(Collectors.partitioningBy(startWithS));

    logger.info(decisionsByS);

    assertTrue(decisionsByS.get(Boolean.TRUE).size() == 3);
}

J'ai vu cela post , mais c'était très ancien, avant Java 8.

21
Elad Benda

Comme cela a été expliqué dans @ RealSkepticcommentPredicate ne peut renvoyer que deux résultats: true et false. Cela signifie que vous ne pourrez diviser vos données qu'en deux groupes.
Ce dont vous avez besoin est une sorte de Function qui vous permettra de déterminer un résultat commun pour les éléments qui doivent être regroupés. Dans votre cas, un tel résultat pourrait être le premier caractère en minuscule (en supposant que toutes les chaînes ne sont pas vides - avoir au moins un caractère).

Maintenant, avec Collectors.groupingBy(function) vous pouvez regrouper tous les éléments dans des listes distinctes et les stocker dans la carte où la clé sera le résultat commun utilisé pour le regroupement (comme le premier caractère).

Ainsi, votre code peut ressembler

Function<String, Character> firstChar =  s -> Character.toLowerCase(s.charAt(0));

List<String> a = Arrays.asList("foo", "Abc", "bar", "baz", "aBc");
Map<Character, List<String>> collect = a.stream()
        .collect(Collectors.groupingBy(firstChar));

System.out.println(collect);

Production:

{a=[Abc, aBc], b=[bar, baz], f=[foo]}
30
Pshemo

Vous pouvez utiliser Collectors.groupingBy pour transformer votre flux de (regroupement) -> (liste des éléments de ce regroupement). Si vous ne vous souciez pas des regroupements eux-mêmes, alors appelez values() sur cette carte pour obtenir un Collection<List<String>> De vos partitions.

5
yshavit