আমি সবেমাত্র নতুন জাভা 8 স্ট্রিম ক্ষমতা আবিষ্কার করেছি। পাইথন থেকে আসছি, আমি ভাবছিলাম যে অ্যারেগুলিতে যোগফলের ব্যবস্থা করার, এখন "একটি লাইনের পাইথোনিক" উপায়ে দুটি অ্যারের গুণনের মতো ঝরঝরে উপায় আছে কি?
ধন্যবাদ
আমি সবেমাত্র নতুন জাভা 8 স্ট্রিম ক্ষমতা আবিষ্কার করেছি। পাইথন থেকে আসছি, আমি ভাবছিলাম যে অ্যারেগুলিতে যোগফলের ব্যবস্থা করার, এখন "একটি লাইনের পাইথোনিক" উপায়ে দুটি অ্যারের গুণনের মতো ঝরঝরে উপায় আছে কি?
ধন্যবাদ
উত্তর:
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();
mapToInt
বক্সিং এড়ানোর জন্য ব্যবহার করতে চান ।
আপনি ব্যবহার করে একটি অ্যারেটিকে স্ট্রীমে পরিণত করতে পারেন 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();
আপনার যদি বিপুল সংখ্যক লোকদের মোকাবেলা করতে হয় তবে সাবধান হন।
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
দয়া করে নোট করুন যে অ্যারেস স্ট্রিম (আরআর) স্ট্রিমের পরিবর্তে একটি লংস্ট্রিম (বা ইন্টারস্ট্রিম, ...) তৈরি করে যাতে মানচিত্রের ফাংশনটি প্রকারটি পরিবর্তন করতে ব্যবহার করা যায় না। এজন্যই .mapToLong, mapToObject, ... ফাংশন সরবরাহ করা হয়।
কটাক্ষপাত কেন-নাকিসুরে কথা-ই-মানচিত্র-পূর্ণসংখ্যার টু স্ট্রিং-হোয়েন-স্ট্রিমিং-থেকে-একটি-বিন্যস্ত
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();