प्रथम तत्व प्राप्त करें जो मापदंड से मेल खाता है


121

पहला तत्व कैसे प्राप्त करें जो एक धारा में एक मापदंड से मेल खाता है? मैंने यह कोशिश की है, लेकिन काम नहीं कर रहा है

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

वह मानदंड काम नहीं कर रहा है, फ़िल्टर विधि स्टॉप की तुलना में किसी अन्य वर्ग में लागू की गई है।

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

}

जवाबों:


213

यह वह हो सकता है जिसे आप ढूंढ रहे हैं:

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.

क्या आप मुझे क्राइटेरिया के लिए एक उदाहरण दे सकते हैं, कृपया? इसके लिए कुछ इस तरह का प्रतिनिधित्व करना चाहिए (स्टॉप s: लिस्टोस्टॉप्स) {if (s.name.equals ("लिंज़") r r}
user2147674

1
स्टॉप्स एक अन्य वर्ग है, ट्रेन में मेथड फिल्टर फ़िल्टर किया गया है, लेकिन मैं SortedSet स्टॉप के सभी स्टॉप तत्वों के माध्यम से चलना चाहता हूं
user2147674

2
मुझे पता है कि मैं गलत हूँ - आलसी धाराएँ अक्षमता को रोकती हैं: stackoverflow.com/questions/23696317/…
स्किचन

2
@alexpfx आप उपयोग कर सकते हैं .findFirst().orElse(yourBackUpGoesHere);। वह भी अशक्त हो सकता है.findFirst().orElse(null);
ifloop

1
@iammrmehul No. findFirst()एक वैकल्पिक वस्तु ( JavaDoc ) देता है, जो खाली हो सकती है। इस स्थिति में कॉल को get()एनपीई फेंक देगा। ऐसा होने से रोकने के लिए, orElse()इसके बजाय का उपयोग करें get()और एक फॉलबैक ऑब्जेक्ट प्रदान करें (जैसे orElse(new Station("dummy", -1)), या findFirst()एक चर के परिणाम को स्टोर करें और isEmpty()कॉल करने से पहले इसे जांचेंget()
ifloop

7

जब आप एक लंबोदर अभिव्यक्ति लिखते हैं, तो तर्क के बाईं ओर की ->सूची या तो एक कोष्ठक तर्क सूची (संभवतः खाली हो सकती है), या किसी भी कोष्ठक के बिना एक एकल पहचानकर्ता हो सकती है। लेकिन दूसरे रूप में, पहचानकर्ता को एक प्रकार के नाम के साथ घोषित नहीं किया जा सकता है। इस प्रकार:

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

यह भी सही है यदि कंपाइलर के पास प्रकारों का पता लगाने के लिए पर्याप्त जानकारी है।


दूसरे के साथ, मुझे एक संदेश मिलता है "क्रिएट लोकल वर" s
user2147674

@ user2147674 क्या यह एक त्रुटि संदेश है? या कंपाइलर सिर्फ आपको सूचित कर रहा है कि यह sलैम्बडा के साथ उपयोग करने के लिए "स्थानीय चर" का एक नया प्रकार बना रहा है ? यह वास्तव में मेरे लिए एक त्रुटि की तरह नहीं दिखता है, लेकिन मैं स्पष्ट रूप से उसी संकलक का उपयोग नहीं कर रहा हूं जैसे आप हैं।
अजब j

1
@ user2147674 यह बहुत अजीब है। मैं दूसरा उदाहरण ( findFirst().get()लागू होने के बाद filter) का उपयोग करने में सक्षम हूं , और मुझे कोई त्रुटि नहीं मिली। तीसरा उदाहरण मेरे लिए भी काम करता है।
अंजब

3

मुझे लगता है कि यह सबसे अच्छा तरीका है:

this.stops.stream().filter(s -> Objects.equals(s.getStation().getName(), this.name)).findFirst().orElse(null);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.