英文:
what would this code be in an alternative way
问题
私人列表<Passenger> getPassengersToRelease() {
返回 passengerList.stream()
.筛选(用户 -> 用户.getDestinationFloor() == currentFloor)
.收集(Collectors.toList());
}
英文:
would anyone be able to write this code in an easier way to understand
private List<Passenger> getPassengersToRelease() {
return passengerList.stream()
.filter(user -> user.getDestinationFloor() == currentFloor)
.collect(Collectors.toList());
}
I really cant get my head around it and have been struggling on it for a few days. Thanks
答案1
得分: 5
以下是一个粗略的翻译,使用了老式的循环方式:
private List<Passenger> getPassengersToRelease() {
List<Passenger> result = new ArrayList<>();
for (Passenger p : passengerList()) {
if (p.getDestinationFloor() == currentFloor) {
result.add(p);
}
}
return result;
}
但更好理解基于流的解决方案是将其分解:
// 将乘客转化为流
passengerList.stream()
// 从流中移除目标楼层不符合条件的乘客
.filter(user -> user.getDestinationFloor() == currentFloor)
// 将剩余的乘客收集到一个新列表中
.collect(Collectors.toList);
唯一棘手的一步是 filter(...)
步骤。传递给 filter
的内容是一个 lambda 表达式。基本上,它是一个内联(无名)函数,将从 Passenger
映射到 boolean
值。user
是该函数的输入变量,表达式 user.getDestinationFloor() == currentFloor
的值是其输出。
因此,过滤器的工作方式如下。对于流中的每个 Passenger
,调用 lambda 表达式。这将为您提供 true
或 false
。如果获得 true
,则保留该 Passenger
。如果获得 false
,则将其从流中删除;即被“过滤掉”。
英文:
Here is a rough translation into an old-fashioned loop:
private List<Passenger> getPassengersToRelease() {
List<Passenger> result = new ArrayList<>();
for (Passenger p: passengerList()) {
if (p.getDestinationFloor() == currentFloor) {
result.add(p);
}
}
return result;
}
But a better way to understand the stream-based solution is doing is to break it down:
// 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);
The only tricky step is the filter(...)
step. The stuff passed as a parameter to filter
is a lambda expression. Basically, it is an inline (unnamed) function that maps from a Passenger
to a boolean
value. The user
is the function's input variable, and the value of the expression user.getDestinationFloor() == currentFloor
is its output.
So the filter works like this. For each Passenger
in the stream, you call the lambda expression. This gives you either true
or false
. If you get true
you pass on the Passenger
. If you get false
you drop it from the stream; i.e. it is "filtered out".
答案2
得分: 2
这里,我认为这是重构你上面发布的代码的最简单方法。如果我错了,请纠正我。
private List<Passenger> getPassengersToRelease() {
List<Passenger> newPassengerList = new ArrayList<>();
for(Passenger user : passengerList) {
if(user.getDestinationFloor() == currentFloor) {
newPassengerList.add(user);
}
}
return newPassengerList;
}
英文:
Here, I think this is the simplest way to refactor code you posted above. If I'm wrong, please correct me.
private List<Passenger> getPassengersToRelease() {
List<Passenger> newPassengerList = new ArrayList<>();
for(Passenger user : passengerList) {
if(user.getDestinationFloor() == currentFloor) {
newPassengerList.add(user);
}
}
return newPassengerList;
}
答案3
得分: 1
这段代码利用了自Java 8以来可用的Stream API。
简而言之,您的代码遍历了一个Passenger
对象的List
,并且.filter(user -> user.getDestinationFloor() == currentFloor)
只过滤具有与currentFloor
值相等的destinationFloor
字段的Passenger
对象。在过滤之后,将结果收集到一个List
中并返回。
英文:
This piece of code is levereging the Stream api available since Java 8.
In short, your code goes through a List
of Passenger
objects, and .filter(user -> user.getDestinationFloor() == currentFloor)
only filters Passenger
objects that have the destinationFloor
field equal with currentFloor
value. After the filtering, the results are collected into a List
and returned.
答案4
得分: 1
private List<Passenger> getPassengersToRelease()
{
List<Passenger> floorPassengers;
for (Passenger user : passengerList)
{
if (user.getDestinationFloor() == currentFloor)
{
floorPassengers.add(user);
}
}
return floorPassengers;
}
应该检查语法,我手头没有编译器。但基本上这个调用会被翻译成带有条件的 for-each 循环。
<details>
<summary>英文:</summary>
This:
private List<Passenger> getPassengersToRelease()
{
List floorPassengers;
for( Passenger user : passengerList )
{
if( user.getDestinationFloor() == currentFloor )
{
floorPassengers.add( user );
}
}
return floorPassengers;
}
Should check the syntax, I have no compiler at hand. But basically the call translates to a for each with a condition.
</details>
# 答案5
**得分**: 1
你可以将其改写为
```java
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][1]。
英文:
You can rewrite it as
private List<Passenger> getPassengersToRelease() {
List<Passenger> list = new ArrayList<Passenger>();
for(Passenger passenger : passengerList){
if(passenger.getDestinationFloor() == currentFloor){
list.add(passenger);
}
}
return list;
}
I also recommend you go through Java SE 8 Streams.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论