জাভা - ল্যাম্বডা এক্সপ্রেশন প্লেটোব্লকচেন ডেটা ইন্টেলিজেন্স সহ একটি স্ট্রীম ফিল্টার করুন। উল্লম্ব অনুসন্ধান. আ.

জাভা - ল্যাম্বডা এক্সপ্রেশন সহ একটি স্ট্রীম ফিল্টার করুন

8 সালে জাভা 2014-এ জাভা স্ট্রীমগুলি চালু করা হয়েছে, একটি কার্যকরী প্রোগ্রামিং দৃষ্টান্তে ভার্বোস জাভা প্রবর্তনের প্রয়াসে। জাভা স্ট্রীমগুলি এক-লাইনারে সংগ্রহ প্রক্রিয়াকরণ সঞ্চালনের জন্য অনেক নমনীয় এবং শক্তিশালী কার্যকরী ক্রিয়াকলাপ প্রকাশ করে।

কিছু পূর্বনির্ধারণের উপর ভিত্তি করে ফিল্টারিং সংগ্রহগুলি সর্বাধিক ব্যবহৃত কার্যকরী ক্রিয়াগুলির মধ্যে একটি হিসাবে রয়ে গেছে, এবং এটি একটি দ্বারা সঞ্চালিত হতে পারে Predicate বা আরো সংক্ষেপে - একটি সঙ্গে ল্যাম্বডা এক্সপ্রেশন.

এই সংক্ষিপ্ত গাইডে, আমরা দেখব কিভাবে আপনি ল্যাম্বডা এক্সপ্রেশন সহ একটি জাভা 8 স্ট্রীম ফিল্টার করতে পারেন।

জাভাতে স্ট্রীম ফিল্টারিং

সাধারণভাবে, যে কোনো Stream এর মাধ্যমে ফিল্টার করা যায় filter() পদ্ধতি, এবং একটি প্রদত্ত পূর্বাভাস:

Stream filter(Predicate<? super T> predicate)

স্ট্রীমের প্রতিটি উপাদান প্রিডিকেটের বিপরীতে চালিত হয় এবং প্রিডিকেট ফিরে এলে আউটপুট স্ট্রীমে যোগ করা হয় true. আপনি একটি সরবরাহ করতে পারেন Predicate দৃষ্টান্ত:

Predicate contains = s -> s.contains("_deprecated");
List results = stream.filter(contains).collect(Collectors.toList());

অথবা, একটি Lambda এক্সপ্রেশন প্রদান করে এটি সরলীকরণ করুন:

List results = stream.filter(s -> s.contains("_deprecated"))
                             .collect(Collectors.toList());

অথবা এমনকি ল্যাম্বডা এক্সপ্রেশনকে একটি তে ভেঙে দিন পদ্ধতির রেফারেন্স:


List results = stream.filter(String::isEmpty)
                             .collect(Collectors.toList());

পদ্ধতির রেফারেন্সের সাহায্যে, আপনি আর্গুমেন্ট পাস করতে পারবেন না, যদিও, আপনি যে বস্তুটিকে ফিল্টার করছেন তাতে পদ্ধতিগুলিকে সংজ্ঞায়িত করতে পারেন এবং সেগুলিকে সহজে ফিল্টারযোগ্য করার জন্য তৈরি করতে পারেন (যতক্ষণ না পদ্ধতিটি আর্গুমেন্ট গ্রহণ না করে এবং একটি রিটার্ন করে boolean).

মনে রাখবেন, যে স্ট্রীম সংগ্রহ নয় - তারা প্রবাহ সংগ্রহের, এবং আপনাকে সেগুলিকে যেকোন সংগ্রহে সংগ্রহ করতে হবে যেমন a List, Map, ইত্যাদি তাদের স্থায়ীত্ব দিতে. উপরন্তু, স্ট্রীম উপাদানের উপর করা হয় সমস্ত অপারেশন অন্তর্বর্তী or প্রান্তিক:

  • মধ্যবর্তী ক্রিয়াকলাপগুলি পূর্ববর্তী ক্রিয়াকলাপ থেকে পরিবর্তন সহ একটি নতুন স্ট্রীম ফিরিয়ে দেয়
  • টার্মিনাল ক্রিয়াকলাপগুলি একটি ডেটা টাইপ ফেরত দেয় এবং একটি প্রবাহে প্রক্রিয়াকরণের একটি পাইপলাইন শেষ করার জন্য বোঝানো হয়

filter() একটি অন্তর্বর্তী অপারেশন, এবং স্ট্রীমটি বন্ধ হওয়ার আগে অন্যান্য মধ্যবর্তী ক্রিয়াকলাপগুলির সাথে শৃঙ্খলিত হতে বোঝানো হয়। যেকোনো পরিবর্তন (যেমন উপাদানে পরিবর্তন, বা ফিল্টার করা ফলাফল) অব্যাহত রাখতে আপনাকে ফলাফল বরাদ্দ করতে হবে আউটপুট স্ট্রীম একটি টার্মিনাল অপারেশনের মাধ্যমে একটি নতুন রেফারেন্স ভেরিয়েবলে।

বিঃদ্রঃ: এমনকি অনেক ল্যাম্বডা এক্সপ্রেশন চেইন করার সময়, আপনি সঠিক লাইনব্রেক সহ পঠনযোগ্যতার সমস্যায় নাও পড়তে পারেন।

নিম্নলিখিত উদাহরণগুলিতে, আমরা এই বইগুলির তালিকা নিয়ে কাজ করব:

Book book1 = new Book("001", "Our Mathematical Universe", "Max Tegmark", 432, 2014);
Book book2 = new Book("002", "Life 3.0", "Max Tegmark", 280, 2017);
Book book3 = new Book("003", "Sapiens", "Yuval Noah Harari", 443, 2011);
        
List books = Arrays.asList(book1, book2, book3);

Stream.filter() দিয়ে ফিল্টার সংগ্রহ

আসুন বইয়ের এই সংগ্রহটি ফিল্টার করি। যেকোন পূর্বাভাস যায় - সুতরাং আসুন উদাহরণস্বরূপ ফিল্টার করা যাক যার দ্বারা বই 400 পৃষ্ঠার বেশি:

List results = books.stream()
                          .filter(b -> b.getPageNumber() > 400)
                          .collect(Collectors.toList());

এর ফলে একটি তালিকা রয়েছে যার মধ্যে রয়েছে:

[
Book{id='001', name='Our Mathematical Universe', author='Max Tegmark', pageNumber=432, publishedYear=2014}, 
Book{id='003', name='Sapiens', author='Yuval Noah Harari', pageNumber=443, publishedYear=2011}
]

ফিল্টার করার সময়, চেইন করার জন্য একটি সত্যিই দরকারী পদ্ধতি map(), যা আপনাকে বস্তুকে অন্য মানতে ম্যাপ করতে দেয়। উদাহরণস্বরূপ, আমরা প্রতিটি বইকে তার নামের সাথে মানচিত্র করতে পারি এবং এইভাবে শুধুমাত্র ফেরত দিতে পারি নাম থেকে predicate মাপসই যে বই filter() কল:

List results = books.stream()
                            .filter(b -> b.getPageNumber() > 400)
                            .map(Book::getName)
                            .collect(Collectors.toList());

এর ফলে স্ট্রিংগুলির একটি তালিকা পাওয়া যায়:

[Our Mathematical Universe, Sapiens]

Stream.filter() এর সাথে একাধিক প্রিডিকেটের ফিল্টার সংগ্রহ

সাধারণত, আমরা একাধিক মানদণ্ড দ্বারা সংগ্রহ ফিল্টার করতে চাই। এটি একাধিক চেইনিং দ্বারা করা যেতে পারে filter() কল or একটি শর্ট-সার্কিট প্রিডিকেট ব্যবহার করে, যা একক দুটি শর্তের জন্য চেক করে filter() কল

 List results = books.stream()
                    .filter(b -> b.getPageNumber() > 400 && b.getName().length() > 10)
                    .collect(Collectors.toList());
                    


 List results2 = books.stream()
                    .filter(b -> b.getPageNumber() > 400)
                    .filter(b -> b.getName().length() > 10)
                    .collect(Collectors.toList());

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

একাধিক মানদণ্ড ব্যবহার করার সময় - ল্যাম্বডা কলগুলি কিছুটা দীর্ঘ হতে পারে। এই মুহুর্তে, এগুলিকে স্বতন্ত্র পূর্বাভাস হিসাবে বের করা আরও স্পষ্টতা দিতে পারে। যদিও, কোন পদ্ধতি দ্রুত?

জটিল অবস্থা বা একাধিক ফিল্টার সহ একক ফিল্টার?

এটি আপনার হার্ডওয়্যারের উপর নির্ভর করে, আপনার সংগ্রহ কত বড় এবং আপনি সমান্তরাল স্ট্রীম ব্যবহার করছেন কি না। সাধারণভাবে - একটি জটিল অবস্থা সহ একটি ফিল্টার সহজ শর্ত (ছোট থেকে মাঝারি সংগ্রহ) সহ একাধিক ফিল্টারকে ছাড়িয়ে যাবে বা একই স্তরে সঞ্চালন করবে (খুব বড় সংগ্রহ)। যদি আপনার শর্তগুলি খুব দীর্ঘ হয় - আপনি সেগুলি একাধিকতে বিতরণ করে উপকৃত হতে পারেন৷ filter() কল, উন্নত পঠনযোগ্যতার জন্য, যেহেতু কর্মক্ষমতা খুব অনুরূপ।

সেরা পছন্দ উভয় চেষ্টা করা হয়, কর্মক্ষমতা নোট করুন লক্ষ্য ডিভাইস, এবং সেই অনুযায়ী আপনার কৌশল সামঞ্জস্য করুন।

GitHub ব্যবহারকারী volkodavs থ্রুপুট অপারেশন/সে একটি ফিল্টারিং বেঞ্চমার্ক করেছে, এবং ফলাফলগুলি হোস্ট করেছে "জাভাফিল্টার-বেঞ্চমার্ক" ভান্ডার ফলাফলগুলি একটি তথ্যপূর্ণ টেবিলে সংক্ষিপ্ত করা হয়েছে:

এটি বৃহত্তর সংগ্রহের আকারে রিটার্নের একটি স্পষ্ট হ্রাস দেখায়, উভয় পন্থা একই স্তরে কাজ করে। সমান্তরাল স্ট্রীমগুলি বৃহত্তর সংগ্রহের আকারে উল্লেখযোগ্যভাবে উপকৃত হয়, তবে ছোট আকারে (~10k উপাদানের নীচে) কর্মক্ষমতা হ্রাস করে। এটা লক্ষণীয় যে সমান্তরাল স্ট্রীমগুলি তাদের থ্রুপুট অ-সমান্তরাল স্ট্রীমগুলির তুলনায় অনেক ভাল বজায় রাখে, যা তাদের ইনপুটের জন্য উল্লেখযোগ্যভাবে আরও শক্তিশালী করে তোলে।

সময় স্ট্যাম্প:

থেকে আরো Stackabuse