java 过滤流的作用,java – 使用流元素之间的相关性过滤流

假设有一个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 ids = persons.stream()

.filter(p -> "A".equalsIgnoreCase(p.getDiscriminator()))

.map(Person::getId)

.collect(Collectors.toSet())

然后删除与那些匹配的条目:

persons.removeIf(x -> ids.contains(x.getId()))

标签:java,java-stream,reduction

来源: https://codeday.me/bug/20190607/1195720.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值