假设我有一个模型
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
留在post函数
基本上,removeRoundTrips
应该可以帮助我只留下那些来了
或走了
的人。
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
,总结他们的came
和gone
属性。为此,您可以在某些 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)
配对并在发生任何碰撞时合并它们,将它们的 came
相加。和gone
字段。
现在,我们准备删除 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/