programing

조건과 일치하는 스트림의 첫 번째 요소를 가져옵니다.

goodsources 2022. 7. 26. 23:42
반응형

조건과 일치하는 스트림의 첫 번째 요소를 가져옵니다.

스트림의 조건과 일치하는 첫 번째 요소를 가져오려면 어떻게 해야 합니까?해봤는데 안 되네

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

}

이것은, 고객이 찾고 있는 것이기도 합니다.

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

그리고 더 좋은 것은, 만약 어떤 요소도 일치하지 않을 가능성이 있다면, 이 경우get()NPE를 던집니다.사용방법:

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


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()
            .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.

람다 식을 쓸 때 왼쪽 인수 리스트는->는 괄호 안의 인수 목록(빈칸) 또는 괄호 없는 단일 ID 중 하나입니다.그러나 두 번째 양식에서는 식별자를 유형 이름으로 선언할 수 없습니다.다음과 같이 됩니다.

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

언급URL : https://stackoverflow.com/questions/22940416/fetch-first-element-of-stream-matching-the-criteria

반응형