Soru Ölçütlerle eşleşen ilk elemanı getir


Bir akıştaki bir ölçütle eşleşen ilk öğe nasıl alınır? Bunu denedim ama çalışmıyor

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

Bu kriter çalışmıyor, filtre yöntemi Stop'dan başka bir sınıfta çağrılır.

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

}

63
2018-04-08 14:42


Menşei




Cevaplar:


Bu sizin aradığınız şey olabilir:

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



Bir örnek:

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

Çıkış:

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

115
2018-04-08 14:45



Kriterler için bana bir örnek verebilir misiniz, lütfen? (Dur s: listofstops) {if (s.name.equals ("Linz") geri dönüşü için bir şeyi temsil etmelidir. - user2147674
@ user2147674 geçerli kodunuzdaki kriterleri tanımladınız ... - Luiggi Mendoza
çalışmıyor. "Böyle bir yerel var" diye bir hata alıyorum - user2147674
Duruşlar başka bir sınıftır, yöntem filtresi Trende invokaded ama SortedSet stoplarının tüm Stop elemanları arasında dolaşmak istiyorum - user2147674
Yanılıyor olduğumdan çıkıyor - tembel akışlar verimsizliği önler: stackoverflow.com/questions/23696317/... - Skychan


Bir lambda ifadesi yazdığınızda, soldaki argüman listesi -> parantezli bir argüman listesi (muhtemelen boş) veya tek bir tanımlayıcı parantez olmadan. Ancak ikinci formda, tanımlayıcı bir tür adıyla bildirilemez. Böylece:

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

yanlış sözdizimi; fakat

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

doğru. Veya:

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

Derleyicinin türleri anlamaya yetecek kadar bilgiye sahip olması da doğrudur.


2
2018-04-08 15:02



İkincisi ile bir mesaj alıyorum "yerel varı oluştur" - user2147674
@ user2147674 Bu bir hata mesajı mı? Veya derleyici size yeni bir "yerel değişken" oluşturduğunu bildiriyor s lambda ile kullanmak için? Bana bir hata gibi gelmiyor, ama görünüşe göre seninle aynı derleyiciyi kullanmıyorum. - ajb
bu bir hata mesajı - user2147674
@ user2147674 Bu oldukça garip. İkinci örneği kullanabiliyorum ( findFirst().get() sonra uygulanan filter) ve herhangi bir hata almıyorum. Üçüncü örnek benim için de çalışıyor. - ajb