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/