使用 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;
}
));
我有一个这样的 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;
}
));