假设有一个Person类看起来像这样:
public class Person {
private int id;
private String discriminator;
// some other fields plus getters/setters
}
现在我有一个Person of Person元素,该流可能包含多个具有相同id但不同鉴别器值的Person实例,即[Person {“id”:1,“discriminator”:“A”},Person {“id” :1,“discriminator”:“B”},Person {“id”:2,“discriminator”:“A”},…]
我想要做的是过滤掉所有具有一些id的Person实例,如果至少有一个具有该id的具有特定鉴别值的Person实例.因此,继续上面的例子,通过鉴别器值“A”过滤将产生一个空集合(当然,在还原操作之后),并且通过鉴别器值“B”过滤将产生一个不包含id等于的任何Person实例的集合. 1.
我知道我可以通过Person.id使用groupingBy收集器和组元素来减少流,然后如果映射列表包含具有指定鉴别器值的Person元素,则从结果Map中删除映射,但我仍然想知道是否有更简单的方法达到同样的效果?
解决方法:
如果我正确理解您的问题,您将首先找到与鉴别器匹配的所有ID:
Set<Integer> ids = persons.stream()
.filter(p -> "A".equalsIgnoreCase(p.getDiscriminator()))
.map(Person::getId)
.collect(Collectors.toSet())
然后删除与那些匹配的条目:
persons.removeIf(x -> ids.contains(x.getId()))