মানদণ্ডের সাথে মেলে এমন প্রথম উপাদানটি আনুন


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: listofstops) এর মতো কিছু উপস্থাপন করা উচিত {যদি (s.name.equals ("লিনজ") ফিরে আসে r}
ব্যবহারকারী 2147674

1
স্টপস অন্য শ্রেণি, পদ্ধতি ফিল্টারটি ট্রেনে চালিত হয় তবে আমি বাছাই করা সেটগুলির সমস্ত স্টপ উপাদানগুলির মধ্য দিয়ে যেতে চাই
ব্যবহারকারী 2147674

2
আউট আমি সক্রিয় ভুল বলছি - অলস স্ট্রিম অযোগ্যতা প্রতিরোধ করুন: stackoverflow.com/questions/23696317/...
Skychan

2
@alexpfx আপনি ব্যবহার করতে পারেন .findFirst().orElse(yourBackUpGoesHere);। এটিও নাল হতে পারে.findFirst().orElse(null);
ifloop

1
@iammrmehul নং 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));

সংকলকটির ধরণগুলি জানার জন্য পর্যাপ্ত তথ্য থাকলে তাও সঠিক।


দ্বিতীয়টির সাথে, আমি একটি বার্তা পেয়েছি "স্থানীয়
বর্ণ

@ user2147674 এটি একটি ত্রুটি বার্তা? অথবা সংকলকটি কেবল আপনাকে জানিয়ে দিচ্ছে যে এটি sল্যাম্বডায় ব্যবহার করার জন্য একটি নতুন ধরণের "লোকাল ভেরিয়েবল" তৈরি করছে? এটি আমার কাছে আসলে ত্রুটির মতো মনে হচ্ছে না, তবে আমি আপাতভাবে আপনার মতো একই সংকলকটি ব্যবহার করছি না।
আজবি

1
@ ইউজার 2147674 এটি বেশ আশ্চর্যজনক। আমি দ্বিতীয় উদাহরণটি ব্যবহার করতে সক্ষম ( findFirst().get()পরে প্রয়োগের সাথে filter), এবং আমি কোনও ত্রুটি পাই না। তৃতীয় উদাহরণটি আমার পক্ষেও কাজ করে।
আজব

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.