How to get first element that matches a criteria in a stream? I've tried this but doesn't work
如何获得与流中的标准匹配的第一个元素?我试过了,但是没用
this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name));
That criteria is not working, the filter method is invoked in an other class than 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;
}
}
2 个解决方案
#1
115
This might be what you are looking for:
这可能是你正在寻找的:
yourStream
.filter(/* your criteria */)
.findFirst()
.get();
An example:
一个例子:
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()
.get();
System.out.printf("At the first stop at Station1 there were %d passengers in the train.", firstStopAtStation1.passengerCount);
}
Output is:
输出是:
At the first stop at Station1 there were 250 passengers in the train.
#2
2
When you write a lambda expression, the argument list to the left of ->
can be either a parenthesized argument list (possibly empty), or a single identifier without any parentheses. But in the second form, the identifier cannot be declared with a type name. Thus:
当您编写lambda表达式时,在->左边的参数列表可以是一个圆括号的参数列表(可能是空的),或者一个没有任何括号的单一标识符。但是在第二种形式中,不能用类型名声明标识符。因此:
this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name));
is incorrect syntax; but
是不正确的语法;但
this.stops.stream().filter((Stop s)-> s.getStation().getName().equals(name));
is correct. Or:
是正确的。或者:
this.stops.stream().filter(s -> s.getStation().getName().equals(name));
is also correct if the compiler has enough information to figure out the types.
如果编译器有足够的信息来计算类型,则也是正确的。
#1
115
This might be what you are looking for:
这可能是你正在寻找的:
yourStream
.filter(/* your criteria */)
.findFirst()
.get();
An example:
一个例子:
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()
.get();
System.out.printf("At the first stop at Station1 there were %d passengers in the train.", firstStopAtStation1.passengerCount);
}
Output is:
输出是:
At the first stop at Station1 there were 250 passengers in the train.
#2
2
When you write a lambda expression, the argument list to the left of ->
can be either a parenthesized argument list (possibly empty), or a single identifier without any parentheses. But in the second form, the identifier cannot be declared with a type name. Thus:
当您编写lambda表达式时,在->左边的参数列表可以是一个圆括号的参数列表(可能是空的),或者一个没有任何括号的单一标识符。但是在第二种形式中,不能用类型名声明标识符。因此:
this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name));
is incorrect syntax; but
是不正确的语法;但
this.stops.stream().filter((Stop s)-> s.getStation().getName().equals(name));
is correct. Or:
是正确的。或者:
this.stops.stream().filter(s -> s.getStation().getName().equals(name));
is also correct if the compiler has enough information to figure out the types.
如果编译器有足够的信息来计算类型,则也是正确的。