জাভা 8 অ্যারেতে স্ট্রিম এবং অপারেশন


197

আমি সবেমাত্র নতুন জাভা 8 স্ট্রিম ক্ষমতা আবিষ্কার করেছি। পাইথন থেকে আসছি, আমি ভাবছিলাম যে অ্যারেগুলিতে যোগফলের ব্যবস্থা করার, এখন "একটি লাইনের পাইথোনিক" উপায়ে দুটি অ্যারের গুণনের মতো ঝরঝরে উপায় আছে কি?

ধন্যবাদ

উত্তর:


294

java.util.Arraysএকটি অ্যারেটিকে জাভা 8 স্ট্রিমে রূপান্তর করতে নতুন পদ্ধতি যুক্ত করা হয়েছে যা পরে যোগফল ইত্যাদির জন্য ব্যবহার করা যেতে পারে

int sum =  Arrays.stream(myIntArray)
                 .sum();

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

//in this example a[] and b[] are same length
int[] a = ...
int[] b = ...

int[] result = new int[a.length];

IntStream.range(0, a.length)
         .forEach(i -> result[i] = a[i] * b[i]);

সম্পাদনা

মন্তব্যকারী @Holger পয়েন্ট ব্যবহার করতে পারেন এমন mapপরিবর্তে পদ্ধতি forEachভালো:

int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();

13
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();
হলগার

2
@ হোলার হ্যাঁ এটিও কার্যকর হবে। যদিও আপনি সম্ভবত mapToIntবক্সিং এড়ানোর জন্য ব্যবহার করতে চান ।
dkatzel

এটি শেষের দিকে জিপের সিমুলেশন হিসাবে আসে যেখানে আপনাকে ফলাফলের জন্য স্টোরেজ প্রিলোকল্ট করতে হবে। আমি ভাবছি স্ট্রিমস লাইব্রেরিতে কেন জিপ নেই?
রেব কেবিন

এই এসও উত্তর অনুসারে , একটি জিপ জাভা 8 এর আগের বিটাতে ছিল, তারপরে বাইরে নেওয়া হয়েছিল। ভাগ্যক্রমে পোস্টারটির উত্স ছিল এবং এটি উত্তরে রয়েছে। আমি কোডটি বেশ কয়েকবার ব্যবহার করেছি এবং এটি খুব ভালভাবে কাজ করছে বলে মনে হচ্ছে।
স্পার্ক_স্প্রেড

@ ডক্যাটজেল - যেহেতু এটি ইতিমধ্যে একটি ইন্টারস্ট্রিম, "মানচিত্র" একটি অন্তর্নিবেশকারী গ্রহণ করে, তাই কোনও বক্সিং জড়িত নেই।
এম জাস্টিন

58

আপনি ব্যবহার করে একটি অ্যারেটিকে স্ট্রীমে পরিণত করতে পারেন Arrays.stream():

int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);

একবার আপনি আপনার স্ট্রিমটি পেয়ে গেলে, আপনি ডকুমেন্টেশনে বর্ণিত যে কোনও পদ্ধতি যেমন পছন্দ sum()বা যাই হোক না কেন ব্যবহার করতে পারেন । ল্যাম্বডা ফাংশনটির সাথে প্রাসঙ্গিক স্ট্রিম পদ্ধতিগুলিকে কল করে আপনি পাইথনে mapবা filterপছন্দ করতে পারেন :

Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);

একবার আপনার স্ট্রিমটি সংশোধন করে toArray()নেওয়ার পরে, আপনি আবার এটিকে অন্য কোথাও ব্যবহারের জন্য আবার অ্যারে রূপান্তর করতে কল করবেন:

int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();

9

আপনার যদি বিপুল সংখ্যক লোকদের মোকাবেলা করতে হয় তবে সাবধান হন।

int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0

উপরের যোগফলটি নয় 2 * Integer.MIN_VALUE। এক্ষেত্রে আপনার এটি করা দরকার।

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct

3

দয়া করে নোট করুন যে অ্যারেস স্ট্রিম (আরআর) স্ট্রিমের পরিবর্তে একটি লংস্ট্রিম (বা ইন্টারস্ট্রিম, ...) তৈরি করে যাতে মানচিত্রের ফাংশনটি প্রকারটি পরিবর্তন করতে ব্যবহার করা যায় না। এজন্যই .mapToLong, mapToObject, ... ফাংশন সরবরাহ করা হয়।

কটাক্ষপাত কেন-নাকিসুরে কথা-ই-মানচিত্র-পূর্ণসংখ্যার টু স্ট্রিং-হোয়েন-স্ট্রিমিং-থেকে-একটি-বিন্যস্ত

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