使用 groupingBy 并过滤掉整个组

Use groupingBy and filtering out entire groups

我有一个这样的 MyObjects 列表

ID Type Description
1 Summary
1 Detail keep this group
1 Detail keep this group
2 Summary
2 Detail don't keep this group
2 Detail don't keep this group

我想按 ID 对列表进行分组,并过滤​​掉不包含任何以“保留此组”作为值的描述的组。

下面是我试过的

   Map<String, List<MyObject>> output =
        myObjectList.stream()
            .collect(Collectors.groupingBy(MyObject::getId,
                    Collectors.filtering(x -> x.getDescription().equals("keep this group"),
                        Collectors.toList())));

这个想法真的行不通。它创建组并删除所有没有“保留此组”的元素

所以第 1 组有 2 个元素,第 2 组有 0 个元素

我想完全拒绝第 2 组并保留第 1 组中的所有元素

我没有测试代码。 它将删除没有任何对象描述等于“保留此组”的组。

Map<String, List<MyObject>> output =
 myObjectList.stream() 
.collect(Collectors.groupingBy(MyObject::getId))
.entrySet()
.stream()
.filter(e-> e.getValue().stream().filter(o->o.getDescription().equals("keep this group")).count()>0)
.collect(Colletors.toMap(Map.Entry::getKey, Map.Entry::getValue));

好像应该用Collectors.collectingAndThen来过滤掉值列表中没有任何项目的组:

Map<String, List<MyObject>> output = myObjectList
    .stream()
    .collect(Collectors.collectingAndThen(
        Collectors.groupingBy(
            MyObject::getId,
            HashMap::new, // or pther mutable implementation of Map
            Collectors.toList()
        ), // Map<String, List<MyObject>>
        map -> { 
            map.entrySet().removeIf(
                e -> e.getValue()
                      .stream()
                      .noneMatch(obj -> "keep this group".equals(obj.getDescription()))
            );
            return map;
        }
    ));