it-swarm.com.ru

Выбрать первый элемент, который соответствует критериям

Как получить первый элемент, который соответствует критериям в потоке? Я пробовал это, но не работает

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

Когда вы пишете лямбда-выражение, список аргументов слева от -> может быть либо списком аргументов в скобках (возможно, пустым), либо одиночным идентификатором без скобок. Но во второй форме идентификатор не может быть объявлен с именем типа. Таким образом:

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