স্প্লিট্রেটর, জাভা 8 এ সংগ্রাহক এবং স্ট্রিম বোঝা


143

Streamজাভা 8 এর ইন্টারফেসটি বুঝতে আমার সমস্যা হচ্ছে , বিশেষত যেখানে এটির Spliteratorএবং Collectorইন্টারফেসগুলির সাথে সম্পর্কযুক্ত। আমার সমস্যাটি হ'ল আমি বুঝতে পারি না Spliteratorএবং Collectorইন্টারফেসগুলি এখনও বুঝতে পারি না এবং ফলস্বরূপ, Streamইন্টারফেসটি এখনও আমার কাছে কিছুটা অস্পষ্ট।

একটি Spliteratorএবং একটি ঠিক কী এবং Collectorআমি কীভাবে সেগুলি ব্যবহার করতে পারি? আমি যদি নিজের লেখা লিখতে ইচ্ছুক ( Spliteratorবা Collectorসম্ভবত Streamসেই প্রক্রিয়াটিতে আমার নিজের ), আমার কী করা উচিত এবং না করা উচিত?

আমি ওয়েবে চারদিকে ছড়িয়ে ছিটিয়ে থাকা কয়েকটি উদাহরণ পড়েছি, তবে যেহেতু এখানে সমস্ত কিছু এখনও নতুন এবং পরিবর্তনের সাপেক্ষে, উদাহরণ এবং টিউটোরিয়ালগুলি এখনও খুব কম।

উত্তর:


142

আপনাকে Spliteratorব্যবহারকারী হিসাবে কখনই মোকাবেলা করতে হবে না ; আপনি কেবল নিজেরাই Collectionটাইপ লিখছেন এবং সেগুলিতে সমান্তরাল ক্রিয়াকলাপ অনুকূল করে তোলার জন্যও যদি এটির প্রয়োজন হয় তবে এটি কেবলমাত্র প্রয়োজনীয় হবে ।

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

আপনার কোনওরূপে Streamভেরিয়েবলের ক্ষেত্রে মূল্যের মান সংরক্ষণ করা উচিত নয়। Streamসাজানোর একটি মত হল Iterator, এ এটি একটি এক-কালীন ব্যবহারযোগ্য বস্তুর যে আপনার প্রায় সবসময় Javadoc উদাহরণ হিসাবে একটি অনর্গল চেন ব্যবহার করব, আছে:

int sum = widgets.stream()
                  .filter(w -> w.getColor() == RED)
                  .mapToInt(w -> w.getWeight())
                  .sum();

Collectorএকটি "কমান" অপারেশনের একটি সর্বাধিক সাধারণীকরণ, বিমূর্ত সম্ভাবনা সংস্করণ যা লা ম্যাপ / হ্রাস; বিশেষত, এর সমান্তরালকরণ এবং চূড়ান্তকরণের পদক্ষেপগুলিকে সমর্থন করা দরকার। এর উদাহরণগুলির মধ্যে Collectorরয়েছে:

  • সংক্ষেপ, যেমন Collectors.reducing(0, (x, y) -> x + y)
  • স্ট্রিংবিল্ডার সংযোজন, উদাঃ Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString)

31
স্প্লিটেটর (গুলি) এছাড়াও একটি সংগ্রহযোগ্য নয় এমন একটি পরিবেশনযোগ্য স্ট্রিমের একটি উপায় সরবরাহ করে
বোহেমিয়ান

2
আমার অর্থ "একটি হ্রাস অপারেশন, এই অর্থে যে শব্দটি মানচিত্রে / হ্রাসে বোঝানো হয়েছে"
লুই ওয়াসারম্যান

1
কি Collectors.ofবিটা সংস্করণ অপসারিত বা করছি-আমি কিছু অনুপস্থিত একটি পুরানো পদ্ধতি? সম্পূর্ণতার জন্য, (x,y) -> x+yহিসাবে লেখা যেতে পারে Integer::sum
জিন-ফ্রান্সোইস সাভার্ড

3
এর, না, দুঃখিত, এটি কালেক্টর.ওফ, কালেক্টর.ওফ নয়।
লুই ওয়াসারম্যান

2
আপনার সংগ্রাহকের প্রত্যেকটি কী করে তা যদি আপনি ব্যাখ্যা করেন তবে আপনার সংগ্রাহকের উদাহরণটি আরও কার্যকর।
মিগুয়েলমুনোজ

90

Spliterator মূলত "স্প্লিটটেবল ইটারেটর" এর অর্থ।

একক থ্রেডটি পুরো স্প্লিটিটরকে নিজেই অতিক্রম করতে পারে / প্রক্রিয়া করতে পারে তবে স্প্লিটেটরটির একটি পদ্ধতিও রয়েছে trySplit()যা অন্য কারও (সাধারণত, অন্য থ্রেড) প্রক্রিয়াকরণের জন্য একটি বিভাগকে "বিভক্ত" করবে - বর্তমান স্প্লিটেরেটরকে কম কাজ করে ফেলে।

Collectorreduceএকটি প্রাথমিক ক্রিয়াকলাপের (মানচিত্র-হ্রাস খ্যাতির) ফাংশনের স্পেসিফিকেশন এবং দুটি ফলকে একত্রিত করার জন্য একটি ফাংশন সমন্বিত করে (এইভাবে কাজের বিভক্ত স্ট্রিমগুলির ফলাফলগুলি একত্রিত করতে সক্ষম করে))

উদাহরণস্বরূপ, সর্বাধিক প্রাথমিক সংগ্রাহকের 0 এর প্রাথমিক ভোজন থাকতে হবে, বিদ্যমান ফলাফলের সাথে একটি পূর্ণসংখ্যা যোগ করবে এবং দুটি ফলাফল যুক্ত করে 'একত্রিত' করবে। এভাবে পূর্ণসংখ্যার বিভক্ত স্ট্রিমটির যোগফল।

দেখা:


দুটি ফলাফল একত্রিত করার মান?
জেসন ল

@ জেসনলও - স্পষ্ট! পরামর্শের জন্য ধন্যবাদ.
থমাস ডাব্লু

5

সাধারণ পরিবর্তনযোগ্য হ্রাস কার্য সম্পাদন করতে পূর্বনির্ধারিত সংগ্রহকারীর ব্যবহারের উদাহরণ নিম্নলিখিত:

 // Accumulate names into a List
 List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());

 // Accumulate names into a TreeSet
 Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));

 // Convert elements to strings and concatenate them, separated by commas
 String joined = things.stream()
                       .map(Object::toString)
                       .collect(Collectors.joining(", "));

 // Compute sum of salaries of employee
 int total = employees.stream()
                      .collect(Collectors.summingInt(Employee::getSalary)));

 // Group employees by department
 Map<Department, List<Employee>> byDept
     = employees.stream()
                .collect(Collectors.groupingBy(Employee::getDepartment));

 // Compute sum of salaries by department
 Map<Department, Integer> totalByDept
     = employees.stream()
                .collect(Collectors.groupingBy(Employee::getDepartment,
                                               Collectors.summingInt(Employee::getSalary)));

 // Partition students into passing and failing
 Map<Boolean, List<Student>> passingFailing =
     students.stream()
             .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

2
এটি অপের প্রশ্নের উত্তর দেয় না, এবং আপনার পোস্টের কোনও ব্যাখ্যা বা বিবরণ নেই।
সিড

4

ইন্টারফেস Spliterator- স্ট্রিমগুলির মূল বৈশিষ্ট্য ।

stream()এবং parallelStream()ডিফল্ট পদ্ধতি উপস্থাপন করা হয় Collectionইন্টারফেস। এই পদ্ধতিগুলি কলটির মাধ্যমে স্প্লিটেটর ব্যবহার করে spliterator():

...

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

...

স্প্লিট্রেটর একটি অভ্যন্তরীণ পুনরাবৃত্তি যা স্ট্রিমটি ছোট অংশে বিভক্ত করে। এই ছোট অংশগুলি সমান্তরালভাবে প্রক্রিয়া করা যায়।

অন্যান্য পদ্ধতির মধ্যে স্প্লিটেরেটর বোঝার জন্য দু'টি গুরুত্বপূর্ণ:

  • boolean tryAdvance(Consumer<? super T> action) এর বিপরীতে Iterator, এটি পরবর্তী উপাদানটির সাথে অপারেশন করার চেষ্টা করে। অপারেশন সফলভাবে সম্পাদন করা হলে, পদ্ধতিটি ফিরে আসে true। অন্যথায়, ফেরৎ দেয় false- এর অর্থ এই যে উপাদানটির অভাব বা প্রবাহের শেষ নেই।

  • Spliterator<T> trySplit() এই পদ্ধতিটি এক বা অন্য মানদণ্ড (ফাইলের আকার, লাইন সংখ্যা ইত্যাদি) অনুযায়ী অনেকগুলি ছোট সেটগুলিতে ডেটার সেটকে বিভক্ত করতে দেয়।


Operationযদি অপারেশনটি সফলভাবে সম্পাদিত হয়..´ আপনার সম্ভবত এটির পুনর্নির্মাণ করা উচিত। ট্রায়াল অ্যাডভান্স জাভাদোক আরও পরিষ্কার: ´ যদি কোনও অবশিষ্ট উপাদান উপস্থিত থাকে, তবে এটিতে প্রদত্ত ক্রিয়াটি সম্পাদন করে, সত্য প্রত্যাবর্তন করে; অন্যথায় মিথ্যা ফিরিয়ে দেয় ´
পিরো মনিকাকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.