2016-04-17 11 views
9

Mam listę a, którą chcę podzielić na kilka małych list.Jak podzielić na partycje listę według predicate za pomocą java8?

powiedzieć wszystkie elementy, które zawiera "aaa", wszystko, co zawiera "bbb" i kilka innych predykatów.

Jak to zrobić, używając java8?

Widziałem to post, ale dzieli się ono tylko na 2 listy.

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); 
} 

Widziałem ten post, ale to był bardzo stary, zanim java 8.

+2

Predykat jest logiczna. Ma po prostu "prawdziwy" i "fałszywy". Myślę, że lepiej byłoby użyć w twojej sprawie 'Function' i' Collectors :: groupingBy'. – RealSkeptic

Odpowiedz

22

Jak wyjaśniono w @RealSkepticcommentPredicate może zwrócić tylko dwa wyniki: true i false. Oznacza to, że możesz podzielić dane tylko w dwóch grupach.
Potrzebny jest pewien rodzaj Function, który pozwoli ci określić jakiś wspólny wynik dla elementów, które powinny być zgrupowane razem. W twoim przypadku taki wynik może być pierwszym znakiem małymi literami (zakładając, że wszystkie ciągi znaków nie są puste - mają co najmniej jeden znak).

Teraz można zgrupować wszystkie elementy w oddzielnych listach i zapisać je w mapie, gdzie klucz będzie wspólny wynik używany do grupowania (jak pierwszy znak).

więc kod może wyglądać

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); 

Wyjście:

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

Można użyć Collectors.groupingBy aby włączyć strumień (grupy) -> (lista rzeczy, w tym grupy). Jeśli nie zależy Ci na samych grupach, zadzwoń na values() na tej mapie, aby uzyskać Collection<List<String>> swoich partycji.

Powiązane problemy