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