java8根据条件从对象列表中删除对象
假设我有一个模型java8根据条件从对象列表中删除对象,java,collections,java-8,Java,Collections,Java 8,假设我有一个模型 Class Travellers{ private int travellerId; private String routeId private int came; private int gone; } 所以旅行者可以去(属性来了)一条路线,然后回来(属性 消失了)。我正试图清除任何已完成往返行程的旅行者。示例条目: id routeId came gone 1 R1 1
Class Travellers{
private int travellerId;
private String routeId
private int came;
private int gone;
}
所以旅行者可以去(属性来了
)一条路线
,然后回来(属性
消失了
)。我正试图清除任何已完成往返行程的旅行者。示例条目:
id routeId came gone
1 R1 1 0
1 R1 0 1
2 R2 0 1
因此,R1
应该被过滤掉,并且只有R2
可以在函数的左边
基本上,trips
应该可以帮助我只留下那些来了
或走了
的人
private List<Travellers> removeRoundTrips(List<Travellers> travellers){
// right now its a classic 'for' loop here
// expectation of something like
travellers.stream()
.filter( traveller -> someFunctionWhichFilters)
.collect(Collectors.toList())
}
private List-trips(列出旅行者){
//现在这是一个经典的“for”循环
//对类似的事情的期望
travelers.stream()
.filter(旅行者->过滤器的某些功能)
.collect(收集器.toList())
}
在java8的流式处理/过滤中是否有实现这一点的方法?私有静态列表(列表旅行者){
private static List<Travellers> removeRoundTrips(List<Travellers> travellers) {
return travellers.stream().collect(Collectors.groupingBy(Travellers::getRouteId)).values().stream()
.filter(v -> v.stream().anyMatch(value -> value.getCame() > 0) ^ v.stream().anyMatch(value -> value.getGone() > 0))
.map(values -> values.iterator().next())
.collect(Collectors.toList());
}
return travelers.stream().collect(收集器.groupingBy(Travelers::getRouteId)).values().stream()
.filter(v->v.stream().anyMatch(value->value.getcome()>0)^v.stream().anyMatch(value->value.getGone()>0))
.map(值->值.iterator().next())
.collect(Collectors.toList());
}
您首先需要合并具有相同travellerId
和routeId
的实例,将它们的来的属性和去的属性相加。为此,您可以在一些travellersutibility
helper类中使用以下实用程序方法:
public final class TravellersUtility {
private TravellersUtility() { }
public static Travellers merge(Travellers left, Travellers right) {
Travellers t = new Travellers();
t.setRouteId(left.getRouteId());
t.setTravellerId(left.getTravellerId());
t.setCame(left.getCame() + right.getCame());
t.setGone(left.getGone() + right.getGone());
return t;
}
}
然后,您可以使用上述方法通过以下方式减少列表
:
要删除这样的实例,我们将使用该方法。如果您对集合
没有问题,那么就完成了。如果需要列表
,只需执行以下操作:
List<Travellers> result = new ArrayList<>(grouped.values());
List result=new ArrayList(grouped.values());
您是否正在寻找任何带有来去==false
的旅行者?类似的情况,但其值可能介于1..10
之间!!过滤器一次只查看一个元素。您可能需要“挤压”具有相同id
和routeId
的元素,然后使用谓词come>0&&gone>0
进行过滤。您必须进一步解释“come”和“gone”的含义。当它们的值在1到10之间时,这意味着什么?当两者均为非零值或具有相同(非零值)值时,路由是否已完成?如果一个旅行者完成了多条路线怎么办?首先,为什么要将这些东西作为单独的项目存储?为什么这个类被命名为“旅行者”,而实际上它甚至不存储一个旅行者,而是存储他们数据的一小部分呢?@Holger。。。哇…慢下来,老师…让我试着回答->在1和10之间,任何值都表示他来了和去了,我之前提到它的原因是为了避免答案尝试布尔运算| |对于come
和gone
present | | |在这种情况下(意味着一个新行),routeId的值都是大于0的,对于最后两个问题->它只是一个示例模式!!!一个实体只有一个来了
/去了
,而不是两个都来了,所以我想这是行不通的!就像在评论中提到的,这是我在<代码>中努力寻找的关键,这是我努力寻找的关键!!
grouped.values().removeIf(t -> t.getCame() > 0 && t.getGone() > 0);
List<Travellers> result = new ArrayList<>(grouped.values());