Java:removeIf两个字段分组的总和等于0
我有一份物品清单。每个项目有3个属性:名称、部分和金额。金额可以是正/负。同一项目可以在同一节中多次出现 我想按节和名称对列表中的项目进行分组。如果此分组的总和等于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
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));