Home > front end >  Java 8 Streams - How to get an equivalent of partitioningBy() with Integer keys?
Java 8 Streams - How to get an equivalent of partitioningBy() with Integer keys?

Time:05-14

In the code shown below, p is a predicate of type Predicate<String>.

Map<Boolean, List<String>> partitioned = numbers.stream()
    .collect(Collectors.partitioningBy(p));

Is it possible to convert the boolean keys to the int type inside the partitioning logic rather than having another stream?

Looks like it could be done with grouping.

Map<String, List<String>> targetTableColumnListMap = nqColumnMapList.stream()
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.groupingBy(
        e -> e.getKey().toUpperCase(), 
        Collectors.mapping(Map.Entry::getValue, Collectors.toList())
    ));

CodePudding user response:

Is it possible to convert the boolean keys to the int type inside the partitioning logic

So you need to associate the values in a list with 0 and 1 (for instance, in order to store the data into the database) based on the given predicate.

For that, instead of partitioningBy() you can use collector groupingBy() in conjunction with the predicate.

Map<Integer, List<String>> partitioned = numbers.stream()
    .collect(Collectors.groupingBy(num -> predicate.test(num) ? 1 : 0));

CodePudding user response:

You could use the terminal operation collect(Collectors.toMap()) to group by your predicate and instead of returning its boolean value as the key you could use a ternary operator to return either 1 or 0.

to convert the boolean keys to the int type

Then, you could map to that key a List built on the String you tested the Predicate with, and to handle the colliding cases you could add the List associated to the second key into the List corresponding to the first key.

Here's a snippet of the code:

//My silly test Predicate
Predicate<String> p = s -> s.length() > 4;

//Mapping the numbers list
Map<Integer, List<String>> partitioned = numbers.stream()
        .collect(Collectors.toMap(s -> p.test(s) ? 1 : 0, 
            s -> new ArrayList<>(List.of(s)), 
            (list1, list2) -> {
                list1.addAll(list2);
                return list1;
            }
        ));

Here, there's also a link to test the code:

https://ideone.com/Kd8xrI

  • Related