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

标签 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           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 ,总结他们的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)配对并在发生任何碰撞时合并它们,将它们的 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/

相关文章:

java - Linux 与 Windows File.delete()

java - 长按无法卸载应用程序

java - 我可以在不硬编码大小的情况下将 ArrayList 中的 Java 值分配给不同的变量吗?

c# - 在 C# 中将 List<Cookie> 转换为 CookieCollection

java - 通过 lambda 表达式调用 System.out.println()

java - 类不能重用是什么意思? (具体来说,Java FX 2 任务)

java - 从列表转换为集合

java - 如何将这个经典的 Java 代码重写为 Java Stream API 代码?

java - Collectors.groupingBy (Function, Supplier, Collector) 不接受 lambda/看不到流值

Java:数组如何提供即时查找