2016-04-17 11 views
9

Ho una lista a che voglio dividere in poche piccole liste.Come partizionare un elenco per predicato usando java8?

dire tutti gli elementi che contiene "aaa", tutto ciò che contiene con "bbb" e altri predicati.

Come posso farlo utilizzando java8?

Ho visto questo post ma si divide solo in 2 elenchi.

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

ho visto questo post, ma era molto vecchio, prima di java 8.

+2

Un predicato è booleano. Ha solo "vero" e "falso". Penso che sarebbe meglio usare un 'Function' e' Collectors :: groupingBy' nel tuo caso. – RealSkeptic

risposta

22

Come è stato spiegato in @RealSkepticcommentPredicate può restituire solo due risultati: vero e falso. Ciò significa che potresti dividere i tuoi dati solo in due gruppi.
Quello che ti serve è una specie di Function che ti permetterà di determinare alcuni risultati comuni per gli elementi che dovrebbero essere raggruppati. Nel tuo caso tale risultato potrebbe essere il primo carattere in minuscolo (assumendo che tutte le stringhe non siano vuote - abbia almeno un carattere).

Ora con Collectors.groupingBy(function) è possibile raggruppare tutti gli elementi in elenchi separati e memorizzarli in Mappa in cui la chiave sarà il risultato comune utilizzato per il raggruppamento (come il primo carattere).

Così il vostro codice può sembrare

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

uscita:

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

È possibile utilizzare Collectors.groupingBy per trasformare il vostro flusso di (raggruppamento) -> (lista delle cose in quel raggruppamento). Se non ti interessa i gruppi stessi, chiama values() su quella mappa per ottenere un Collection<List<String>> delle tue partizioni.

Problemi correlati