কীভাবে পিক () এবং অলম্যাচ () জাভা 8 স্ট্রিম এপিআইতে একসাথে কাজ করে


10

আমি নীচে নীচে পিক পদ্ধতির জাভা 8 স্ট্রিম এপিআই সম্পর্কে একটি কুইজ পেয়েছি

Arrays.asList("Fred", "Jim", "Sheila")
      .stream()
      .peek(System.out::println)
      .allMatch(s -> s.startsWith("F"));

আউটপুট হয়

Fred
Jim

আমি বিভ্রান্ত হয়ে পড়েছি কীভাবে এই ধারাটি কাজ করে? আমার প্রত্যাশিত ফলাফল হওয়া উচিত

Fred
Jim
Sheila

পিক () পদ্ধতিটি একটি মধ্যবর্তী অপারেশন এবং এটি স্ট্রিমের প্রতিটি উপাদানকে প্রক্রিয়া করে। কেউ আমাকে এই ব্যাখ্যা করতে পারেন।

উত্তর:


10

এটি একটি স্ট্রিম অপ্টিমাইজেশন শর্ট সার্কিট হিসাবে পরিচিত। মূলত, যা ঘটে তা হ'ল স্ট্রিমের allMatchঅপ্রয়োজনীয় মধ্যবর্তী ক্রিয়াকলাপগুলি কার্যকর করা বাধা দেয় কারণ চূড়ান্ত ফলাফলটি জানা গেলে সেগুলি সম্পাদনের কোনও মানে হয় না।

এটা যেমন ঘটেছিল:

take"Fred"
peek("Fred")
evaluate("Fred".startsWith("F"))
decide whether the result of allMatch() is known for sure: Not yet

take"Jim"
peek("Jim")
evaluate("Jim".startsWith("F"))
decide whether the result of allMatch() is known for sure: Yes

যখন "Jim".startsWith("F")মূল্যায়ন করা হয়, ফলাফল allMatch(s -> s.startsWith("F"))নির্দিষ্ট জন্য পরিচিত। পাইপলাইনে কোন মানগুলি পরে আসে তা বিবেচনাধীন নয় "Jim", আমরা জানি যে সমস্ত মান "F" দিয়ে শুরু হয় তা মিথ্যা

এটি peek/ allMatchসংমিশ্রণের সাথে সুনির্দিষ্ট নয় , একাধিক মধ্যবর্তী এবং টার্মিনাল শর্ট সার্কিট ক্রিয়াকলাপ রয়েছে। java.util.streamপ্যাকেজের ডক্সের অবস্থা:

আরও কিছু অপারেশন শর্ট সার্কিটের ক্রিয়াকলাপ হিসাবে বিবেচিত হয়। একটি মধ্যবর্তী ক্রিয়াকলাপ সংক্ষিপ্তসার্কিটে হয়, যখন অসীম ইনপুট উপস্থাপিত হয়, ফলস্বরূপ এটি একটি সসীম প্রবাহ তৈরি করতে পারে। একটি টার্মিনাল অপারেশন সংক্ষিপ্তসার্কিটে হয়, যখন অসীম ইনপুট উপস্থাপন করা হয়, এটি সীমাবদ্ধ সময়ে শেষ হতে পারে। পাইপলাইনে একটি সংক্ষিপ্তসার্কিট ক্রিয়াকলাপ অপরিহার্য প্রবাহের প্রক্রিয়াজাতকরণের সীমাবদ্ধ সময়ে সাধারণত শেষ করার জন্য প্রয়োজনীয় তবে যথেষ্ট নয়।

সীমাবদ্ধ স্ট্রিমগুলিতে এটিকে প্রসারিত করুন এবং শর্ট সার্কিট ক্রিয়াকলাপগুলি আপনার উদাহরণের মতো অপ্রয়োজনীয় পাইপলাইন পদক্ষেপগুলি কার্যকর করতে বাধা দেয়।


5
Arrays.asList("Fred", "Jim", "Sheila")
      .stream()
      .peek(System.out::println)
      .allMatch(s -> s.startsWith("F"));
  • প্রথম বারের মাধ্যমে, Fredমুদ্রিত হয়। এটি তাই মেলে
  • দ্বিতীয় বারের মাধ্যমে, Jimমুদ্রিত হয়। এটি মিলছে না তাই অল ম্যাচ শেষ হয়েছে কারণ "সমস্ত মিলছে না"
  • সুতরাং শেষ আইটেমটি স্ট্রিম থেকে গ্রাস করা হয়নি।

3

ডক্স জন্য peekপদ্ধতি বলে (জোর খনি):

ফলাফলের স্ট্রিম থেকে উপাদানগুলি গ্রাস হওয়ায় প্রতিটি স্ট্রিমের সরবরাহিত ক্রিয়া সম্পাদন করে, এই স্ট্রিমের উপাদানগুলির সমন্বয়ে একটি স্ট্রিম ফিরিয়ে দেয়

সুতরাং এই ক্ষেত্রে, peekদেখতে পাবে না "Sheila"কারণ সেই মানটি স্ট্রিম থেকে গ্রাস করা হয়নি। যত তাড়াতাড়ি "Jim"সেবন করা হয়েছিল, এর ফলাফল .allMatch(s -> s.startsWith("F"))ইতিমধ্যে জানা গিয়েছে false, সুতরাং প্রবাহ থেকে আর কোনও উপাদান গ্রহণ করার দরকার নেই।


1

সমস্ত মিলের জাভা ডক অনুসারে ():

এই স্ট্রিমের সমস্ত উপাদান সরবরাহিত প্রাকটিকে মেলে কিনা তা ফেরত দেয়। ফলাফল নির্ধারণের জন্য প্রয়োজনীয় না হলে সমস্ত উপাদানগুলির প্রিডিকেট মূল্যায়ন করতে পারে না। স্ট্রিমটি খালি থাকলে then @ কোড সত্য} ফিরে আসে এবং প্রিডিকেট মূল্যায়ন হয় না।

@apiNote

এই পদ্ধতিটি স্ট্রিমের উপাদানগুলির (সমস্ত এক্স পি (এক্স) জন্য) প্রিডিকেটের সার্বজনীন পরিমাণ নির্ধারণ করে। যদি স্ট্রিমটি খালি থাকে তবে পরিমাণটি শূন্যপদে সন্তুষ্ট বলে এবং সর্বদা {@ কোড সত্য} (পি (এক্স) নির্বিশেষে) থাকে।

এই স্ট্রিমের উপাদানগুলিতে প্রয়োগ করার পূর্বাভাস করুন @ রিটার্ন {@ কোড সত্য} যদি হয় স্ট্রিমের সমস্ত উপাদান সরবরাহিত প্রাকটিকে মেলে বা স্ট্রিমটি খালি থাকে, অন্যথায় c @ কোড মিথ্যা}

আপনার ক্ষেত্রে:

1-

p(x) : s -> s.startsWith("F")

X : "Fred"

result : X P(X) = true

2-

p(x) : s -> s.startsWith("F")

X : "Jim"

result : X P(X) = false

এক্সপি (এক্স) = মিথ্যা বলে অন্য কোনও মূল্যায়ন হবে না

boolean result = Arrays.asList("Fred", "Finda", "Fish")
            .stream()
            .peek(System.out::println)
            .allMatch(s -> s.startsWith("F"));
    System.out.println("Result "+result);

আউটপুট হল:

Fred
Finda
Fish
Result true

এখানে স্ট্রিমটি সম্পূর্ণ প্রক্রিয়াজাত কারণ xP (x) = প্রতিটি উপাদান থেকে সত্য

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