এই জাভা 8 স্ট্রিম সংগ্রহ () পদ্ধতিটি কীভাবে বোঝবেন?


12

আমি কোনও ইনট অ্যারে তালিকায় রূপান্তরিত করার চেষ্টা করছিলাম এবং আমি জাভা 8 স্ট্রিম ব্যবহারের অপরিচিত পথটি নিয়েছি এবং এটি নিয়ে এসেছি

Arrays.stream(arr).boxed().collect(Collectors.toList());

আমার এখনও এই লাইনটি পুরোপুরি বুঝতে অসুবিধা হচ্ছে, বেশিরভাগ ক্ষেত্রে,

  1. কেন Collectors.toList()এই ক্ষেত্রে একটি ArrayList<Integer>বাস্তবায়ন Listইন্টারফেস ফিরে আসে ? কেন LinkedList<Integer>বা অন্য কোনও জেনেরিক শ্রেণি Listইন্টারফেসের সাথে মানাবে না ? আমি এই সম্পর্কে কিছু খুঁজে, একটি সংক্ষিপ্ত ArrayList এর উল্লেখ করা ছাড়া তাদের করতে এখানে , এপিআই নোট বিভাগে।

  2. বাম প্যানেল মানে কি? স্পষ্টতই জেনেরিক রিটার্ন টাইপ ( আমার কোডটিতে এখানে)। এবং আমি মনে করি পদ্ধতিটির জেনেরিক ধরণের আর্গুমেন্ট, তবে সেগুলি কীভাবে নির্দিষ্ট করা হয়? আমি কালেক্টর ইন্টারফেস ডকটি সন্ধান করেছি এবং এটি শোষণ করতে সক্ষম হইনি।এখানে চিত্র বর্ণনা লিখুন Stream.collect()RArrayList<Integer><R, A>


2
1. এটি হুডের নীচে প্রকৃত তালিকা ব্যবহার করে, স্পষ্টতই। তবে কোনও এপিআইয়ের পক্ষে প্রকৃত অন্তর্নিহিত তালিকার ধরণটি প্রকাশ করা বুদ্ধিমানের কাজ হবে। তার পর থেকে তারা ভবিষ্যতে আর কখনও বাস্তবায়ন পরিবর্তন করতে পারেনি। সাধারণভাবে, কেবলমাত্র ইন্টারফেসগুলি প্রকাশ করা এবং আসল অন্তর্নিহিত ধরণের কখনও নয় এটি প্রায়শই ভাল ধারণা। ২. Rফলাফল ফলাফলের জেনেরিক ধরণ। Aমধ্যকার সংগ্রহের জেনেরিক ধরণের সংগ্রহকারের ধরণ। এটি হ'ল কোনও সংগ্রাহক কীভাবে কাজ করে তার বিশদকরণ divide
জাবুজার্ড

10
আপনি আসলে কখনও লিঙ্কডলিস্ট চান না । জোশ ব্লচের একটি টুইট রয়েছে , "আমি এটি লিখেছিলাম, এবং আমি কখনই এটি ব্যবহার করি না"।
অ্যান্ডি টার্নার

4
" Collectors.toList()এই ক্ষেত্রে কেন একটি ফেরত দেয় ArrayList<Integer>" এটি কোনওরূপে ফিরে আসে না ArrayListListবাস্তবায়ন করা হয় অনির্দিষ্ট করে, যাতে আপনি বাস্তবায়ন এটা ফেরৎ উপর নির্ভর করতে পারবে না। যেমন জাভাদোক বলেছেন: " তালিকার ধরণ , পরিবর্তন, সিরিয়ালাইজিবিলিটি বা থ্রেড-সুরক্ষার কোনও গ্যারান্টি নেই ;"
Andreas

3
এবং toList()একটি আসছে না ArrayListবা List- এটি একটি ফিরে আসছে Collectorযা অবশেষে তৈরি এবং ফিরে আসবে, একটি List- এছাড়াও ডকুমেন্টেশন রাজ্যের: "... কোন গ্যারান্টী আছে টাইপ , পরিবর্তনশীলতা, serializability, অথবা তালিকা থ্রেড-নিরাপত্তা ফিরে; যদি প্রত্যাশিত তালিকার আরও নিয়ন্ত্রণের প্রয়োজন হয়, সারণি (সরবরাহকারী) ব্যবহার করুন .... "
ব্যবহারকারী 85421-নিষিদ্ধ

3
আমি দৃ strongly
হলগার

উত্তর:


18
  1. এটি একটি ডিফল্ট বাস্তবায়ন। ArrayListব্যবহৃত হয়, কারণ এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে সেরা, তবে এটি আপনার পক্ষে উপযুক্ত না হলে আপনি সর্বদা আপনার নিজের সংগ্রাহককে সংজ্ঞায়িত করতে পারেন এবং Collectionআপনার ইচ্ছার জন্য কারখানা সরবরাহ করতে পারেন:

    Arrays.stream(arr).boxed().collect(toCollection(LinkedList::new));
  2. হ্যাঁ, Aএবং Rএই পদ্ধতির জেনেরিক প্যারামিটারগুলি Rহ'ল, রিটার্নের ধরণটি Tহ'ল ইনপুট টাইপ এবং Aএকটি অন্তর্বর্তী প্রকার, যা উপাদান সংগ্রহের পুরো প্রক্রিয়াতে উপস্থিত হয় (এটি দৃশ্যমান নাও হতে পারে এবং এই ফাংশনটি উদ্বেগ করে না)। শুরুতে Collectorএর javadoc যারা ধরনের (তারা সমগ্র ডক জুড়ে সামঞ্জস্যপূর্ণ হয়) সংজ্ঞায়িত করে:

    টি - হ্রাস অপারেশন
    এ ইনপুট উপাদানগুলির ধরণ A - হ্রাস অপারেশনটির পরিবর্তনীয় জমে থাকা প্রকার (প্রায়শই প্রয়োগের বিবরণ হিসাবে লুকানো থাকে)
    আর - হ্রাস অপারেশনের ফলাফলের ধরণ


আচ্ছা আমি দেখি. আমার ধারণা আমার List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());মাইলিস্টের উপরে তালিকার ইন্টারফেসে ঘোষিত কেবলমাত্র পদ্ধতিগুলিতেই আমি সত্যই আঁকড়ে ধরে কল করতে পারি call অন্যথায় আমি সম্ভাব্য নিজেকে ঝুঁকির মধ্যে ফেলছি, যদি ওরাকল জাভা 8 ইউ 1024 বা 15-তে ডিফল্ট প্রয়োগটি পরিবর্তন করার সিদ্ধান্ত নেয়?
ব্যবহারকারী3207158

2
@ ব্যবহারকারী3207158 পদ্ধতিটি একটি প্রদান করে List, তাই বাস্তবায়ন যা কিছু ব্যবহৃত হয়, আচরণ একই। জাভাটির নতুন সংস্করণগুলিতে ইন্টারফেসটি পরিবর্তিত হওয়ার সম্ভাবনা নেই।
অ্যান্ড্রোনিকাস

1
  1. এই ক্ষেত্রে কেন সংগ্রাহক. টোলিস্ট () অ্যারেলিস্ট প্রয়োগকারী তালিকা ইন্টারফেসটি প্রদান করে?

পদ্ধতির সংজ্ঞায়িত হিসাবে এটি সংগ্রাহক সরবরাহকারী হিসাবে একটি সংগ্রাহক বাস্তবায়ন ফেরত দেয় ArrayList। সুতরাং, এটি নীচের পদ্ধতির সংজ্ঞা থেকে খুব স্পষ্ট যে Collectors.toListসর্বদা অ্যারেলিস্ট সংগ্রাহক ( While it's arguable why toList not toArrayList word is used in method name) প্রদান করে।

public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }
  1. <R, A> R collect(Collector<? super T, A, R> collector)মানে বাম প্যানেল কি না

আপনি যদি ডকুমেন্টেশন মন্তব্যগুলিকে উল্লেখ করেন তবে সঠিকভাবে উল্লেখ করা হয় যে এই জেনেরিক প্রকারগুলি কী:

/*
      @param <R> the type of the result
      @param <A> the intermediate accumulation type of the {@code Collector}
      @param collector the {@code Collector} describing the reduction
      @return the result of the reduction
*/
 <R, A> R collect(Collector<? super T, A, R> collector);

ধন্যবাদ জনাব. আপনি Collectors.toList()(প্রথম স্নিপেট) এর উত্স কোডটি কোথায় পেয়েছেন ? এটা কি ওপেনজেডকে?
ব্যবহারকারী3207158

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