获取与条件匹配的流的第一个元素

如何获得匹配流中条件的第一个元素? 我尝试过这个方法,但是没有用

this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name));

该条件不起作用,则在 Stop 以外的其他类中调用筛选器方法。

public class Train {


private final String name;
private final SortedSet<Stop> stops;


public Train(String name) {
this.name = name;
this.stops = new TreeSet<Stop>();
}


public void addStop(Stop stop) {
this.stops.add(stop);
}


public Stop getFirstStation() {
return this.getStops().first();
}


public Stop getLastStation() {
return this.getStops().last();
}


public SortedSet<Stop> getStops() {
return stops;
}


public SortedSet<Stop> getStopsAfter(String name) {




// return this.stops.subSet(, toElement);
return null;
}
}




import java.util.ArrayList;
import java.util.List;


public class Station {
private final String name;
private final List<Stop> stops;


public Station(String name) {
this.name = name;
this.stops = new ArrayList<Stop>();


}


public String getName() {
return name;
}


}
210357 次浏览

这可能就是你要找的:

yourStream
.filter(/* your criteria */)
.findFirst()
.get();

更好的情况是,如果存在匹配非元素的可能性,在这种情况下 get()将抛出 NPE。因此使用:

yourStream
.filter(/* your criteria */)
.findFirst()
.orElse(null); /* You could also create a default object here */


举个例子:
public static void main(String[] args) {
class Stop {
private final String stationName;
private final int    passengerCount;


Stop(final String stationName, final int passengerCount) {
this.stationName    = stationName;
this.passengerCount = passengerCount;
}
}


List<Stop> stops = new LinkedList<>();


stops.add(new Stop("Station1", 250));
stops.add(new Stop("Station2", 275));
stops.add(new Stop("Station3", 390));
stops.add(new Stop("Station2", 210));
stops.add(new Stop("Station1", 190));


Stop firstStopAtStation1 = stops.stream()
.filter(e -> e.stationName.equals("Station1"))
.findFirst()
.orElse(null);


System.out.printf("At the first stop at Station1 there were %d passengers in the train.", firstStopAtStation1.passengerCount);
}

产出为:

At the first stop at Station1 there were 250 passengers in the train.

在编写 lambda 表达式时,->左侧的参数列表可以是带括号的参数列表(可能为空) ,也可以是不带括号的单个 标识符。但是在第二种形式中,标识符不能用类型名声明。因此:

this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name));

是不正确的语法; 但是

this.stops.stream().filter((Stop s)-> s.getStation().getName().equals(name));

是正确的,或者:

this.stops.stream().filter(s -> s.getStation().getName().equals(name));

也是正确的,如果编译器有足够的信息来计算出类型。

我认为这是最好的办法:

this.stops.stream().filter(s -> Objects.equals(s.getStation().getName(), this.name)).findFirst().orElse(null);