3

任何人都能够以更容易理解的方式编写此代码吗

 private List<Passenger> getPassengersToRelease() {

        return passengerList.stream()
                .filter(user -> user.getDestinationFloor() == currentFloor)
                .collect(Collectors.toList());
    }

我真的无法理解它,并且已经为此苦苦挣扎了几天。谢谢

4

5 回答 5

5

这是对老式循环的粗略翻译:

private List<Passenger> getPassengersToRelease() {
    List<Passenger> result = new ArrayList<>();
    for (Passenger p: passengerList()) {
        if (p.getDestinationFloor() == currentFloor) {
             result.add(p);
        }
    }
    return result;
}

但是理解基于流的解决方案的更好方法是将其分解:

// give us the passengers as a stream
passengerList.stream() 

   // remove any passengers from the stream that DO NOT have the given
   // destination floor.
   .filter(user -> user.getDestinationFloor() == currentFloor)

   // put the passengers that remain into a new list.
   .collect(Collectors.toList);

唯一棘手的步骤是filter(...)步骤。作为参数传递给的东西filter是一个lambda 表达式Passenger基本上,它是一个从 a 映射到一个boolean值的内联(未命名)函数。是函数的user输入变量,表达式的值user.getDestinationFloor() == currentFloor是它的输出。

所以过滤器是这样工作的。对于Passenger流中的每个,您调用 lambda 表达式。这为您提供truefalse。如果你得到true你传递Passenger. 如果你把false它从流中删除;即它被“过滤掉”。

于 2020-04-06T10:17:44.340 回答
2

在这里,我认为这是重构您上面发布的代码的最简单方法。如果我错了,请纠正我。

private List<Passenger> getPassengersToRelease() {

        List<Passenger> newPassengerList = new ArrayList<>();
        for(Passenger user : passengerList) {
            if(user.getDestinationFloor() == currentFloor) {
                newPassengerList.add(user);
            }
        }
        return newPassengerList;
    }
于 2020-04-06T10:20:40.447 回答
1

这段代码利用了自 Java 8 以来可用的Stream api 。

简而言之,您的代码会遍历一个对象,并且只过滤字段与值相等List的对象。过滤后,将结果收集到a中并返回。Passenger.filter(user -> user.getDestinationFloor() == currentFloor)PassengerdestinationFloorcurrentFloorList

于 2020-04-06T10:15:45.607 回答
1

这个:

private List<Passenger> getPassengersToRelease() 
{
    List floorPassengers;
    for( Passenger user : passengerList )
    {
        if( user.getDestinationFloor() == currentFloor )
        {
            floorPassengers.add( user );
        }
    }
    return floorPassengers;
}

应该检查语法,我手头没有编译器。但基本上,该调用转换为每个带有条件的调用。

于 2020-04-06T10:17:44.707 回答
1

您可以将其重写为

private List<Passenger> getPassengersToRelease() {
    List<Passenger> list = new ArrayList<Passenger>();

    for(Passenger passenger : passengerList){
        if(passenger.getDestinationFloor() == currentFloor){
            list.add(passenger);
        }
    }
    return list;
}

我还建议您通过Java SE 8 Streams

于 2020-04-06T10:20:40.980 回答