gpt4 book ai didi

java8 从对象列表中删除对象的基本条件

转载 作者:行者123 更新时间:2023-11-30 07:42:38 25 4
gpt4 key购买 nike

假设我有一个模型

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 留在后置函数中

基本上,removeRoundTrips 应该可以帮助我只留下那些camegone 的人。

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())

}

有没有办法在 java8 中的流式处理/过滤中实现这一点?

最佳答案

您首先需要合并具有相同 travellerId 的实例和 routeId ,总结他们的camegone属性。为此,您可以在某些 TravellersUtility 中使用以下实用方法辅助类:

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>通过使用 Collectors.toMap :

Map<List<Object>, Travellers> grouped = travellers.stream()
.collect(Collectors.toMap(
t -> Arrays.asList(t.getTravellerId(), t.getRouteId()),
Function.identity(),
TravellersUtility::merge));

Travellers实例 (travellerId, routeId)对并在发生任何碰撞时合并它们,求和它们的 camegone字段。

现在,我们准备删除 Travellers来自尚未完成往返的 map 值的实例:

grouped.values().removeIf(t -> t.getCame() > 0 && t.getGone() > 0);

要删除此类实例,我们使用 Collection.removeIf 方法。如果您对 Collection<Travellers> 满意, 你完成了。如果你需要 List<Travellers> , 简单地做:

List<Travellers> result = new ArrayList<>(grouped.values());

关于java8 从对象列表中删除对象的基本条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54302769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com