Java 8 Streams - 如何使用 Integer 键获得等效的 partitioningBy()?

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

在下面显示的代码中,p 是类型为 Predicate<String> 的谓词。

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

是否可以在分区逻辑中将 boolean 键转换为 int 类型,而不是使用另一个流?

看起来可以用 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())
    ));

您可以使用终端操作 collect(Collectors.toMap()) 按谓词分组,而不是 return 将其 boolean 值作为键,您可以使用三元运算符 return 1 或 0。

to convert the boolean keys to the int type

然后,您可以将 List 映射到您测试 Predicate 所用的 String 上构建的 List,并处理冲突情况,您可以添加 List将第二个键关联到第一个键对应的List中。

这是代码片段:

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

这里还有一个link测试代码:

https://ideone.com/Kd8xrI

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

因此您需要将列表中的值与 01 相关联(例如,为了将数据存储到数据库中 ) 基于给定的 predicate.

为此,您可以将收集器 groupingBy()predicate.

结合使用,而不是 partitioningBy()
Map<Integer, List<String>> partitioned = numbers.stream()
    .collect(Collectors.groupingBy(num -> predicate.test(num) ? 1 : 0));