Java:removeIf两个字段分组的总和等于0

Java:removeIf两个字段分组的总和等于0,java,java-stream,predicate,Java,Java Stream,Predicate,我有一份物品清单。每个项目有3个属性:名称、部分和金额。金额可以是正/负。同一项目可以在同一节中多次出现 我想按节和名称对列表中的项目进行分组。如果此分组的总和等于0-删除具有此节和名称的所有项 我走了这么远 items.stream().collect(Collectors.groupingBy(ItemData::getSection)).... 现在我需要第二个分组,并将其与0进行比较,以便将其添加为removeIf的谓词 items.removeIf(item -> predic

我有一份物品清单。每个项目有3个属性:名称、部分和金额。金额可以是正/负。同一项目可以在同一节中多次出现

我想按节和名称对列表中的项目进行分组。如果此分组的总和等于0-删除具有此节和名称的所有项

我走了这么远

items.stream().collect(Collectors.groupingBy(ItemData::getSection))....
现在我需要第二个分组,并将其与0进行比较,以便将其添加为removeIf的谓词

items.removeIf(item -> predicate(item));

您可以首先根据
部分
名称
项目数据
分组,并将
金额之和作为值

   Map<String,Long> result = details.stream()
            .collect(Collectors.groupingBy(det -> det.getSection()+"_"+det.getName(),
                    Collectors.summingLong(det->det.getAmount())));
然后从
items
列表中删除元素,该列表在
Map
中有条目,并带有键比较

items.removeIf(item -> result.containsKey(item.getSection()+"_"+item.getName()));
您还可以通过使用stream消除值为
0
的条目

Map<String,Long> result = details.stream()
            .collect(Collectors.groupingBy(det -> det.getSection()+"_"+det.getName(),
                    Collectors.summingLong(det->det.getCount())))
           .entrySet()
           .stream()
           .filter(entry->entry.getValue()==0)
           .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
Map result=details.stream()
.collect(collector.groupingBy(det->det.getSection()+“\ux”+det.getName(),
Collectors.summingLong(det->det.getCount())
.entrySet()
.stream()
.filter(条目->条目.getValue()==0)
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

或者,您可以使用
BiPredicate
接受
项目和
列表

BiPredicate biPred=
(项,列表)->list.stream()
.filter(i->i.getName().equals(item.getName())&&
i、 getSection().equals(item.getSection())
.mapToLong(项目::getAmount)
.sum()==0;
myList.removeIf(e->biPred.test(e,myList));

您的回复不仅回答了我的问题,还澄清了我对其他解决方案的想法,我读过,但没有完全理解,因此也感谢您的回复。哦,我喜欢死池!或者在没有
entrySet.removeIf…
的一个步骤中,只需将分组的
Map
用作
items.removeIf(item->result.get(item.getSection()+““+item.getName())==0)。但是分组怎么可能是0?你能举个例子吗?
Map<String,Long> result = details.stream()
            .collect(Collectors.groupingBy(det -> det.getSection()+"_"+det.getName(),
                    Collectors.summingLong(det->det.getCount())))
           .entrySet()
           .stream()
           .filter(entry->entry.getValue()==0)
           .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
BiPredicate<Item,List<Item>> biPred = 
    (item, list) -> list.stream()
                        .filter(i -> i.getName().equals(item.getName()) && 
                                     i.getSection().equals(item.getSection()))
                        .mapToLong(Item::getAmount)
                        .sum() == 0;

myList.removeIf(e -> biPred.test(e, myList));