java - StreamAPI Collectors.groupingBy 空集合而不是 null

标签 java java-8 java-stream

List<Entity> entities = ...
Map<Boolean, List<Entity>> entitiesByIsTest = entities.stream()
                        .collect(Collectors.groupingBy(Entity::isTest));

很明显,结果映射具有分组属性中存在的唯一键。对于具有不定式值集的类型,它必须像这样工作。但是枚举/boolean 值/其他确定的类型呢?

是否有可能比下面的代码片段更优雅地实现空集合的初始化?

if (entitiesByIsTest.get(true) == null) {
    entitiesByIsTest.put(true, new ArrayList());
}

最佳答案

如果你想要Boolean键和两个映射始终初始化,使用 partitioningBy ,它具有所需的属性。

Map<Boolean, List<Entity>> entitiesByIsTest = entities.stream()
                        .collect(Collectors.partitioningBy(Entity::isTest));

如果键是 enum ,你必须留在groupingBy , 但您可以替换后续的 get操作

List<Entity> value=map.computeIfAbsent(key, x->new ArrayList<>());

这将构建并放置一个新的 ArrayList当且仅当没有先前的映射并在任何一种情况下返回实际映射值(与 putIfAbsent 不同)。

当然,您可以在一个急切的操作中添加所有缺失的值:

EnumSet.allOf(KeyType.class).forEach(key->map.computeIfAbsent(key, x->new ArrayList<>()));

关于java - StreamAPI Collectors.groupingBy 空集合而不是 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40000422/

相关文章:

java - 如果我在多线程服务器程序中运行并行代码会发生什么?

java - 如何在 Android Studio 1 中创建签名的 apk 时禁用像 Eclipse 这样的错误

Java - 8 : dynamic method arguments

java - 从流中过滤可为空的值并更新可为空的属性

java - 如何将 Map<String, List<Object>> 流式传输到 Stream<Entry<String, Object>> 中?

java - double 转换为 NaN

java - 什么是NullPointerException,我该如何解决?

Java:如何使用函数式编程正确操作 BigDecimal 数组?

java-8 - 两个简单的 IBM MQ 客户端测试写入 MQ 队列 - 为什么一个有效,而另一个无效?

java - 如何将 for-each 循环重写为流?