ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে উপাদান উপস্থিত রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


118

বিশেষত, আমার ট্যাবপেন রয়েছে এবং আমি এটিতে নির্দিষ্ট আইডি সহ কোনও উপাদান রয়েছে কিনা তা জানতে চাই।

সুতরাং, আমি জাভাতে ল্যাম্বডা এক্সপ্রেশন দিয়ে এটি করতে চাই:

boolean idExists = false;
String idToCheck = "someId";

for (Tab t : tabPane.getTabs()){
    if(t.getId().equals(idToCheck)) {
        idExists = true;
    }
}

উত্তর:


273

anyMatchলাম্বদা এক্সপ্রেশন ব্যবহার করার চেষ্টা করুন । এটা অনেক ভাল পদ্ধতির।

 boolean idExists = tabPane.getTabs().stream()
            .anyMatch(t -> t.getId().equals(idToCheck));

11
এছাড়াও লক্ষণীয়: আপনি যদি চেক ব্যবহারের noneMatchপরিবর্তে অবহেলা করতে চান anyMatch
ব্ল্যাকলাইট


50

গৃহীত উত্তরটি সঠিক হলেও আমি আরও মার্জিত সংস্করণ যুক্ত করব (আমার মতে):

boolean idExists = tabPane.getTabs().stream()
    .map(Tab::getId)
    .anyMatch(idToCheck::equals);

স্ট্রিম # ম্যাপ () ব্যবহার করে অবহেলা করবেন না যা এটি প্রয়োগ করার আগে ডেটা কাঠামোকে সমতল করতে দেয় Predicate


3
এখানে ভাল কি? আমি কেবল আরও একটি অপারেশন দেখতে পাচ্ছি। দুঃখিত আমি এই লম্পা জিনিস নতুন।
TecHunter

2
@ টেকহান্টার এটি আরও স্পষ্ট is কল্পনা করুন আপনি এই কোডটি প্রথমবার পড়েন, বা আবার কিছুক্ষণ পরে। বিভিন্ন সুবিধা রয়েছে: প্রথমত, আমরা তাত্ক্ষণিকভাবে দেখাই যে আমরা আসলে ট্যাবে আগ্রহী নই, তবে এর কিছু ম্যাপিং করছি। দ্বিতীয়ত, পদ্ধতির উল্লেখগুলি ব্যবহার করে (যা কেবলমাত্র সম্ভব কারণ আমরা প্রাথমিক ল্যাম্বডাটিকে দুটি ধাপে বিভক্ত করি) আমরা দেখাই যে কোডটিতে কোনও আশ্চর্য লুকানো নেই। তৃতীয়ত, পদ্ধতির উল্লেখগুলি ব্যবহার করে আমরা একটি নতুন প্রেডিকেট তৈরি করি না, তবে সত্যই কেবল পুনরায় ব্যবহার করি equals। যদিও মঞ্জুর করা হয়েছে, এখানে উদাহরণটি খুব সহজ, তবে আমি আশা করি আপনি যা বলতে চাইছেন তা পেয়ে গেছেন।
মাল্টে হার্টভিগ

@ মাল্টে হার্টভিগ ধন্যবাদ! হ্যাঁ আমি আপনার 3 পয়েন্ট পেয়েছি কিন্তু আমি সমতলতা সম্পর্কে জিজ্ঞাসা করছিলাম map, এটি অন্য কোনও প্রক্রিয়াধীন পদক্ষেপ না? আমি 2 টি পদ্ধতির তুলনা করার চেষ্টা করব :)
TecHunter

1
@ মাল্টে হার্টভিগ একটি 10kk অ্যারেলিস্টে পরীক্ষা করেছেন একটি সাধারণ অবজেক্টের সাথে শেষ উপাদানটি অনুসন্ধান করার চেষ্টা করছেন। আপনার জন্য 133ms এর বিপরীতে একটি 2ms পার্থক্য 131ms দেয়। 1kk অ্যারে তালিকায় আপনার 2 মিমি (55 মিমি থেকে 53 মিমি) দ্রুত হলে সুতরাং আমরা বলতে পারি যে আপনার চেয়ে ভাল :) :)
টেকহান্টর

2
@ টেকহান্টার প্রাপ্তরা অত্যন্ত সস্তা। অতিরিক্ত 2 মিলিসেকেন্ড সংরক্ষণের ক্ষেত্রে সর্বদা কোডের স্বচ্ছতা পছন্দ করুন (যদিও আমি সন্দেহ করি ফলাফলগুলি নির্ভুল, এটি প্রতিটি রানেই ওঠানামা করতে পারে)। এছাড়াও, মনে রাখবেন যে স্ট্রিমগুলিতে মধ্যবর্তী ক্রিয়াকলাপগুলি (যেমন map) প্রকৃতির দ্বারা অলস । তার মানে এই যে getIdসংগ্রহের প্রতিটি উপাদান প্রয়োগ করা হয় না। সত্যanyMatch প্রত্যাবর্তনের আগ পর্যন্ত এটি অলসভাবে মূল্যায়ন করা হয় ।
জেফ্রেনেটিক

3

উপরের উত্তরগুলির জন্য আপনাকে একটি নতুন স্ট্রিম অবজেক্টটি ম্যালোক করা দরকার।

public <T>
boolean containsByLambda(Collection<? extends T> c, Predicate<? super T> p) {

    for (final T z : c) {
        if (p.test(z)) {
            return true;
        }
    }
    return false;
}

public boolean containsTabById(TabPane tabPane, String id) {
    return containsByLambda(tabPane.getTabs(), z -> z.getId().equals(id));
}
...
if (containsTabById(tabPane, idToCheck))) {
   ...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.