Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to partition a list by predicate using java8?

I have a list a which i want to split to few small lists.

say all the items that contains with "aaa", all that contains with "bbb" and some more predicates.

How can I do so using java8?

I saw this post but it only splits to 2 lists.

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

I saw this post, but it was very old, before java 8.

like image 281
Elad Benda Avatar asked Apr 17 '16 15:04

Elad Benda


2 Answers

Like it was explained in @RealSkeptic comment Predicate can return only two results: true and false. This means you would be able to split your data only in two groups.
What you need is some kind of Function which will allow you to determine some common result for elements which should be grouped together. In your case such result could be first character in its lowercase (assuming that all strings are not empty - have at least one character).

Now with Collectors.groupingBy(function) you can group all elements in separate Lists and store them in Map where key will be common result used for grouping (like first character).

So your code can look like

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

Output:

{a=[Abc, aBc], b=[bar, baz], f=[foo]} 
like image 173
Pshemo Avatar answered Sep 24 '22 14:09

Pshemo


You can use Collectors.groupingBy to turn your stream of (grouping) -> (list of things in that grouping). If you don't care about the groupings themselves, then call values() on that map to get a Collection<List<String>> of your partitions.

like image 34
yshavit Avatar answered Sep 21 '22 14:09

yshavit