web-dev-qa-db-ja.com

基準に一致する最初の要素を取得する

ストリームの条件に一致する最初の要素を取得する方法は?私はこれを試しましたが、動作しません

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;
}

}
88
user2147674

これはあなたが探しているものかもしれません:

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



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

出力は次のとおりです。

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

164
ifloop

ラムダ式を記述する場合、->の左側の引数リストは、括弧で囲まれた引数リスト(空の場合もあります)、または括弧のない単一の識別子のいずれかです。しかし、2番目の形式では、識別子を型名で宣言することはできません。したがって:

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

コンパイラが型を把握するのに十分な情報を持っている場合も正しいです。

4
ajb

これが最良の方法だと思います:

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