এই ব্লগ পোস্টে, আমরা জাভা 8 স্ট্রীমের বৈশিষ্ট্যগুলি নিয়ে আলোচনা করতে যাচ্ছি এবং অনেকগুলি বিভিন্ন কোড উদাহরণ প্রদান করতে যাচ্ছি৷
জাভা স্ট্রীমগুলি জাভাতে কার্যকরী প্রোগ্রামিং নিয়ে আসে এবং সেগুলি জাভা 8 থেকে শুরু করে সমর্থিত হয় তাই যদি আপনার কাছে জাভার একটি পুরানো সংস্করণ থাকে, তাহলে জাভা স্ট্রিমগুলি ব্যবহার করার জন্য আপনাকে জাভা 8 এ আপগ্রেড করতে হবে৷
কেন জাভা স্ট্রীম ব্যবহার করবেন?
স্ট্রিমের কিছু সুবিধা:
- স্ট্রিমগুলি আপনাকে আরও দক্ষ জাভা প্রোগ্রামার করে তুলবে (আপনি দেখতে পাবেন যে কোডের খুব কম লাইন দিয়ে আপনি আসলে স্ট্রিম ব্যবহার করে অনেক কিছু অর্জন করতে পারেন)।
- তারা ল্যাম্বডা এক্সপ্রেশনের ব্যাপক ব্যবহার করে যা ডিসপোজেবল ফাংশন।
- ParallelStreams খুব সহজে বড় ডেটাসেটের জন্য মাল্টি-থ্রেডেড অপারেশন সক্ষম করে।
স্ট্রিম পাইপলাইন
বেশিরভাগ ক্ষেত্রে, একটি স্ট্রিম পাইপলাইনে একটি
থাকে- উৎস (যেখান থেকে আপনার ডেটা প্রবাহিত হয়)
- এর পরে শূন্য বা তার বেশি মধ্যবর্তী অপারেশন
- এবং একটি টার্মিনাল অপারেশন
উত্সটি উপাদানগুলির একটি স্ট্রিম প্রবাহিত করতে চলেছে৷
৷উপাদানগুলির সেই স্ট্রীমটি ফিল্টার করা, বাছাই করা যেতে পারে বা একে ম্যাপ করা যেতে পারে বা প্রতিটি উপাদানে প্রয়োগের বিভিন্ন ধারার অপারেশন করা যেতে পারে।
শেষে, এটি হয় সংগ্রহ বা হ্রাস করা যেতে পারে বা অন্য কিছু টার্মিনাল অপারেশন করা যেতে পারে কিন্তু শুধুমাত্র একটি টার্মিনাল অপারেশন সঞ্চালিত হয়।
স্ট্রিম উৎস
স্ট্রিম উত্স৷ সংগ্রহ, তালিকা, সেট, int, longs, double, স্ট্রিং ইত্যাদির অ্যারে থেকে আসতে পারে।
স্ট্রিম অপারেশন
স্ট্রিম অপারেশন হয় মধ্যবর্তী বা টার্মিনাল:
- ইন্টারমিডিয়েট অপারেশনস যেমন ফিল্টার, মানচিত্র, বা সাজান একটি স্ট্রীম রিটার্ন যাতে আমরা একাধিক মধ্যবর্তী অপারেশন চেইন করতে পারি।
- টার্মিনাল অপারেশন একটি স্ট্রীম গ্রহণ করে এবং তারা হয় অকার্যকর ফেরত দিতে পারে বা তারা একটি নন-স্ট্রীম ফলাফল যেমন একটি হ্রাস, যেমন. একটি তালিকায় আইটেম হ্রাস করুন৷
ইন্টারমিডিয়েট অপারেশনস
- শূন্য বা তার বেশি মধ্যবর্তী অপারেশন অনুমোদিত।
- অর্ডার সংক্রান্ত বিষয়; বড় ডেটাসেটের জন্য:প্রথমে ফিল্টার করুন তারপর সাজান বা মানচিত্র।
- খুব বড় ডেটাসেটের জন্য আমরা একাধিক থ্রেড সক্ষম করতে ParallelStream করি।
মধ্যবর্তী ক্রিয়াকলাপের মধ্যে রয়েছে:
- anyMatch()
- স্বতন্ত্র()
- ফিল্টার()
- ফাইন্ড ফার্স্ট()
- ফ্ল্যাটম্যাপ()
- মানচিত্র()
- এড়িয়ে যান()
- সর্টেড()
টার্মিনাল অপারেশন
শুধুমাত্র একটি টার্মিনাল অপারেশন অনুমোদিত হয়.
- forEach প্রতিটি উপাদানের জন্য একই ফাংশন প্রয়োগ করে উদাহরণস্বরূপ প্রতিটি উপাদান প্রিন্ট করুন৷
- সংগ্রহ একটি সংগ্রহ বা একটি তালিকা বা একটি অ্যারেতে সমস্ত উপাদান সংরক্ষণ করে৷
- অন্যান্য সব বিকল্প স্ট্রীমকে একটি একক সারাংশ উপাদানে কমিয়ে দেয়।
হ্রাস ফাংশনের কিছু উদাহরণ হল:
- গণনা()
- সর্বোচ্চ()
- মিন()
- কমাও()
জাভা স্ট্রিম কোড উদাহরণ
এখন কোড উদাহরণে উপরের ধারণাগুলো দেখি।
পূর্ণসংখ্যা স্ট্রীম
প্রথম উদাহরণ শুধুমাত্র একটি পূর্ণসংখ্যা স্ট্রীম. আমরা IntStream
ব্যবহার করে একটি পূর্ণসংখ্যা স্ট্রীম তৈরি করতে যাচ্ছি ক্লাস এবং এর রেঞ্জ ফাংশন যা আমাদেরকে পূর্ণসংখ্যার একটি পরিসীমা দেয়।
forEach
আমাদের টার্মিনাল অপারেশন. প্রতিটি আইটেমের জন্য, আমরা শুধু এটি প্রিন্ট আউট করতে যাচ্ছি।
import java.io.IOException;
import java.util.stream.IntStream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream
.range(1, 10)
.forEach(System.out::print);
System.out.println();
}
}
আউটপুট:
123456789
এড়িয়ে যাওয়ার সাথে পূর্ণসংখ্যা স্ট্রীম
দ্বিতীয় উদাহরণটি একটি পূর্ণসংখ্যা স্ট্রীম ব্যবহার করে কিন্তু আমরা একটি skip()
যোগ করেছি এখানে, তাই এই ক্ষেত্রে, আমরা আমাদের স্ট্রীমের প্রথম 5টি উপাদান এড়িয়ে যাচ্ছি।
এটি শুধুমাত্র 6 থেকে 9 পর্যন্ত উপাদান মুদ্রণ করবে। আইটেমটি প্রিন্ট করতে আমরা একটি সাধারণ ল্যাম্বডা এক্সপ্রেশনও ব্যবহার করছি
import java.io.IOException;
import java.util.stream.IntStream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream
.range(1, 10)
.skip(5)
.forEach(x -> System.out.println(x));
System.out.println();
}
}
আউটপুট:
6
7
8
9
সমষ্টি সহ পূর্ণসংখ্যা স্ট্রীম
তৃতীয় উদাহরণ, আমরা আবার IntStream
ব্যবহার করি যদিও আমাদের বস্তুর স্ট্রীম তৈরি করতে, আমরা সেটিকে println()
এর ভিতরে রাখি প্রিন্ট লাইনের প্যারামিটার হিসাবে বিবৃতি।
আমরা যা প্রিন্ট করতে যাচ্ছি তা হল 1 থেকে 5 পরিসরের যোগফল অন্য কথায়, 1 2 3 এবং 4 এটি শুধুমাত্র সেই সংখ্যাগুলির যোগফল প্রিন্ট করতে চলেছে:
import java.io.IOException;
import java.util.stream.IntStream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
System.out.println(
IntStream
.range(1, 5)
.sum());
System.out.println();
}
}
আউটপুট:
10
Stream.of
পরবর্তী উদাহরণ Stream.of
ব্যবহার করে ফাংশন, যা সত্যিই সুবিধাজনক কারণ আপনি পূর্ণসংখ্যা, ভাসমান বিন্দুর মান বা স্ট্রিং বা এমনকি বস্তু স্ট্রিম করতে পারেন।
এই উদাহরণে, আমরা শুধু একটি সোজা বর্ণানুক্রমিক সাজানোর কাজ করতে যাচ্ছি তারপর আমরা findFirst()
ব্যবহার করে প্রথম আইটেমটি খুঁজতে যাচ্ছি। ফাংশন তারপর, আমরা তালিকার প্রথম আইটেমটি প্রিন্ট আউট করি।
import java.io.IOException;
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream.of("Ava", "Aneri", "Alberto")
.sorted()
.findFirst()
.ifPresent(System.out::println);
}
}
আউটপুট
Alberto
অ্যারে থেকে স্ট্রীম, সাজান, ফিল্টার এবং মুদ্রণ করুন
আমাদের পরবর্তী উদাহরণে, আমরা একটি অ্যারে থেকে স্ট্রিম করতে যাচ্ছি। তারপর আমরা সাজাতে যাচ্ছি, ফিল্টার করব এবং তারপর প্রিন্ট করব।
এখানে, আমরা শুধুমাত্র s
দিয়ে শুরু হওয়া আইটেমগুলিকে ফিল্টার করতে যাচ্ছি .
আমরা একটি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করি যা X
নেয় কোনটি প্রতিটি নাম এবং তারপর এটি পরীক্ষা করে কোনটি অক্ষর s
দিয়ে শুরু হয় এবং এটি সেগুলিকে পাস করবে৷
তারপরে আমরা সেগুলিকে সাজাতে যাচ্ছি এবং তারপরে প্রতিটি আইটেমের জন্য যা এই সাজানোর পাস করে আমরা এটি প্রিন্ট করতে যাচ্ছি৷
import java.io.IOException;
import java.util.Arrays;
public class JavaStreams {
public static void main(String[] args) throws IOException {
String[] names = {"Al", "Ankit", "Kushal", "Brent", "Sarika", "amanda", "Hans", "Shivika", "Sarah"};
Arrays.stream(names)
.filter(x -> x.startsWith("S"))
.sorted()
.forEach(System.out::println);
}
}
আউটপুট:
Sarah
Sarika
Shivika
পূর্ণসংখ্যা বিন্যাসের গড়
এখন দেখা যাক কিভাবে আমরা একটি int অ্যারের বর্গক্ষেত্রের গড় নিতে পারি।
এখানে, আমরা Arrays.stream()
ব্যবহার করি পূর্ণসংখ্যা স্ট্রিম করার জন্য ফাংশন এবং তারপর আমরা map()
ব্যবহার করতে যাচ্ছি প্রতিটি আইটেম প্রতিটি পূর্ণসংখ্যাকে তার বর্গক্ষেত্রে ম্যাপ করতে।
import java.util.Arrays;
public class JavaStreams {
public static void main(String[] args) {
Arrays.stream(new int[] {2, 4, 6, 8, 10})
.map(x -> x * x)
.average()
.ifPresent(System.out::println);
}
}
আউটপুট:
44.0
মনে রাখবেন এটি একটি পূর্ণসংখ্যার পরিবর্তে দ্বিগুণ প্রিন্ট করে।
তালিকা থেকে স্ট্রীম, ফিল্টার এবং মুদ্রণ
এই উদাহরণে, আমরা একটি তালিকা থেকে স্ট্রিম করতে যাচ্ছি, সেই আইটেমগুলিকে ফিল্টার করব এবং তারপরে প্রিন্ট করব৷
৷
মনে রাখবেন যে map()
-এর মধ্যে ফাংশন, আমরা সমস্ত নাম ছোট হাতের অক্ষরে রূপান্তর করতে যাচ্ছি।
import java.util.Arrays;
import java.util.List;
public class JavaStreams {
public static void main(String[] args) {
List<String> people = Arrays.asList("Al", "Ankit", "Brent", "Sarika", "amanda", "Hans", "Shivika", "Sarah");
people
.stream()
.map(String::toLowerCase)
.filter(x -> x.startsWith("a"))
.forEach(System.out::println);
}
}
আউটপুট:
al
ankit
amanda
আমরা দেখতে পাচ্ছি আমাদের তিনটি নাম আছে যা a
দিয়ে শুরু হয় এবং সেগুলি সবই ছোট হাতের অক্ষরে৷
টেক্সট ফাইল থেকে স্ট্রীম সারি, সাজান, ফিল্টার এবং মুদ্রণ
আমাদের পরবর্তী উদাহরণে, আমরা একটি পাঠ্য ফাইল থেকে সারি স্ট্রিম করতে যাচ্ছি। আমরা বাছাই, ফিল্টার এবং প্রিন্ট করতে যাচ্ছি।
ধরা যাক আমাদের কাছে bands.txt
নামে একটি ফাইল আছে নিচে দেখানো বিষয়বস্তু সহ:
Rolling Stones
Lady Gaga
Jackson Browne
Maroon 5
Arijit Singh
Elton John
John Mayer
CCR
Eagles
Pink
Aerosmith
Adele
Taylor Swift
আমরা Files.lines()
ব্যবহার করতে যাচ্ছি আমাদের স্ট্রীম তৈরি করতে যা আমাদের ফাইলের প্রতিটি লাইনের জন্য একটি স্ট্রিংয়ের একটি স্ট্রীম দেবে৷
একবার আমাদের স্ট্রীম হয়ে গেলে, আমরা সেগুলিকে সাজাতে যাচ্ছি এবং আমরা 13টি অক্ষরের বেশি আইটেমগুলিকে ফিল্টার করতে যাচ্ছি এবং তারপরে বাকি থাকা আইটেমগুলিকে প্রিন্ট করব৷
অবশেষে, আমাদের ফাইলটি বন্ধ করতে হবে তাই আমরা bands.close
করি .
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream<String> bands = Files.lines(Paths.get("bands.txt"));
bands
.sorted()
.filter(x -> x.length() > 13)
.forEach(System.out::println);
bands.close();
}
}
আউটপুট:
Jackson Browne
Rolling Stones
আমরা 13টির বেশি অক্ষর বিশিষ্ট দুটি ব্যান্ড পেয়েছি।
টেক্সট ফাইল থেকে সারি স্ট্রিম করুন এবং তালিকায় সংরক্ষণ করুন
এই উদাহরণের জন্য, আমরা উপরের মত একই টেক্সট ফাইল ব্যবহার করব।
আমরা সেই আইটেমগুলিকে ফিল্টার করতে চাই যেখানে jit
অক্ষর রয়েছে , x.contains()
ব্যবহার করে যা শুধুমাত্র একটি স্ট্রিং ফাংশন।
.collect()
ব্যবহার করে আমরা jit
অক্ষর সহ সবগুলো যোগ করি একটি তালিকায়।
একবার আমাদের তালিকা তৈরি হলে, আমরা forEach
ব্যবহার করতে পারি আইটেম প্রিন্ট করার জন্য অপারেটর।
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
public class JavaStreams {
public static void main(String[] args) throws IOException {
List<String> bands2 = Files.lines(Paths.get("bands.txt"))
.filter(x -> x.contains("jit"))
.collect(Collectors.toList());
bands2.forEach(x -> System.out.println(x));
}
}
আউটপুট:
Arijit Singh
CSV ফাইল থেকে স্ট্রীম সারি এবং গণনা
এই উদাহরণে, আমরা একটি CSV ফাইল থেকে সারিগুলি স্ট্রিম করি এবং আমরা ভাল সারিগুলি গণনা করতে যাচ্ছি৷
ধরুন আমাদের কাছে data.txt
নামে একটি ফাইল আছে নিম্নলিখিত বিষয়বস্তু সহ:
A,12,3.7
B,17,2.8
C,14,1.9
D,23,2.7
E
F,18,3.4
এখানে, সারি E এর কোনো ডেটা নেই, তাই আমরা আমাদের স্ট্রীম থেকে সেটিকে বাদ দিতে চাই।
নিম্নলিখিত কোডে, আমরা প্রতিটি সারিতে পড়তে যাচ্ছি তারপর আমাদের কমাগুলিতে একটি অ্যারেতে বিভক্ত করতে হবে যাতে প্রতিটি সারি আইটেমগুলির একটি অ্যারে হয়ে যায়।
তারপরে আমরা তিনটি আইটেম নেই এমন সারিগুলিকে ফিল্টার করার জন্য একটি ফিল্টার প্রয়োগ করি৷
৷import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream<String> rows1 = Files.lines(Paths.get("data.txt"));
int rowCount = (int)rows1
.map(x -> x.split(","))
.filter(x -> x.length == 3)
.count();
System.out.println(rowCount + " rows.");
rows1.close();
}
}
আউটপুট:
5 rows
কমানো - যোগফল
এই উদাহরণ আপনাকে দেখায় কিভাবে হ্রাস ব্যবহার করতে হয়। আমরা একটি যোগফল কমাতে যাচ্ছি। এখানে, Stream.of()
ব্যবহার করে আমাদের একটি ডাবল স্ট্রিম আছে ফাংশন আমরা তিনটি ভিন্ন আর্গুমেন্টে তিনটি দ্বিগুণ সংজ্ঞায়িত করেছি এবং আমরা হ্রাস ফাংশন ব্যবহার করতে যাচ্ছি৷
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) {
double total = Stream.of(7.3, 1.5, 4.8)
.reduce(0.0, (Double a, Double b) -> a + b);
System.out.println("Total = " + total);
}
}
আউটপুট:
13.600000000000001