Stream Creation: from Collections, Arrays, Generators, and I/O Channels
Stream Creation in Java: from Collections, Arrays, Generators, and I/O Channels
अगर आप Java Programming सीख रहे हैं और Streams का concept समझना चाहते हैं, तो यह topic आपके लिए बहुत useful है। आज हम बात करेंगे कि Java में Stream objects को कैसे create किया जाता है — Collections, Arrays, Generators और I/O Channels से। यह concept exam और interview दोनों के लिए बहुत important है क्योंकि Java Stream API Java 8 का सबसे बड़ा innovation माना जाता है।
Stream Creation from Collections
सबसे आसान तरीका Stream create करने का है Java Collection framework से। कोई भी Collection जैसे कि List, Set, या Queue में stream() method पहले से available होता है। जब हम इस method को call करते हैं, तो यह उस collection के सारे elements को एक Stream के form में return करता है।
Example: Stream from List
import java.util.*;
import java.util.stream.*;
public class ListStreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Ravi", "Amit", "Kiran", "Riya");
Stream<String> stream = names.stream();
stream.forEach(System.out::println);
}
}
ऊपर के example में हमने List से Stream create की है और फिर forEach() method से हर element print किया है। Stream का फायदा यह है कि आप easily filter, map या reduce operations apply कर सकते हैं बिना किसी loop के।
Example: Stream from Set
Set<Integer> numbers = new HashSet<>(Arrays.asList(10, 20, 30, 40));
numbers.stream().filter(n -> n > 20).forEach(System.out::println);
यहाँ हमने Set से Stream create की और filter किया कि सिर्फ 20 से बड़े numbers print हों। यह short और readable तरीका है data process करने का।
- stream(): Sequential stream create करता है।
- parallelStream(): Parallel stream create करता है जो multi-threaded processing करता है।
Stream Creation from Arrays
Collections के अलावा Arrays से भी Stream create करना बहुत आसान है। इसके लिए Java हमें Arrays.stream() method देता है। आप primitive या object arrays दोनों के लिए इसका use कर सकते हैं।
Example: Stream from Object Array
String[] fruits = {"Apple", "Banana", "Mango"};
Stream<String> fruitStream = Arrays.stream(fruits);
fruitStream.forEach(System.out::println);
Example: Stream from Primitive Array
int[] marks = {85, 90, 78, 88};
IntStream markStream = Arrays.stream(marks);
markStream.filter(m -> m > 80).forEach(System.out::println);
Primitive arrays (जैसे int[], long[], double[]) के लिए Java अलग-अलग Stream classes provide करता है जैसे IntStream, LongStream, और DoubleStream।
Table: Stream Classes for Primitives
| Data Type | Stream Class | Example |
|---|---|---|
| int[] | IntStream | Arrays.stream(intArray) |
| long[] | LongStream | Arrays.stream(longArray) |
| double[] | DoubleStream | Arrays.stream(doubleArray) |
Stream Creation from Generators
Java में Streams create करने का एक और powerful तरीका है Stream.generate() और Stream.iterate() methods से। ये दोनों methods infinite या dynamic Streams बनाने में काम आते हैं।
1. Stream.generate()
यह method Supplier interface के साथ काम करता है और हर बार एक नया element produce करता है। यह तब useful है जब आप random values या fixed pattern generate करना चाहते हैं।
Stream<Double> randomStream = Stream.generate(Math::random).limit(5);
randomStream.forEach(System.out::println);
यहाँ Math.random() हर बार एक new random number return करता है और limit(5) Stream को सिर्फ 5 elements तक restrict करता है।
2. Stream.iterate()
यह method एक seed value से शुरू होकर हर बार next value generate करता है। यह sequential value generation के लिए बहुत useful है।
Stream<Integer> evenStream = Stream.iterate(2, n -> n + 2).limit(5);
evenStream.forEach(System.out::println);
ऊपर के code में हमने 2 से शुरू किया और हर बार 2 add करके next even number generate किया। Result होगा: 2, 4, 6, 8, 10।
- generate(): Random या repetitive data create करने के लिए।
- iterate(): Sequential predictable data create करने के लिए।
Stream Creation from I/O Channels
Java Stream API को file reading या input/output operations के साथ भी use किया जा सकता है। Java में Files.lines() और BufferedReader.lines() methods text files से Stream create करने के लिए इस्तेमाल होते हैं।
Example: Using Files.lines()
import java.nio.file.*;
import java.io.*;
import java.util.stream.*;
public class FileStreamExample {
public static void main(String[] args) throws IOException {
Path path = Paths.get("data.txt");
Stream<String> lines = Files.lines(path);
lines.forEach(System.out::println);
lines.close();
}
}
यह method हर line को एक Stream element के रूप में treat करता है। यह file reading को बहुत clean और functional बनाता है।
Example: Using BufferedReader.lines()
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
br.lines().filter(line -> line.contains("Java")).forEach(System.out::println);
यहाँ हमने file की हर line को Stream में convert किया और फिर filter किया कि सिर्फ वो lines print हों जिनमें “Java” शब्द हो।
Table: Common I/O Stream Creation Methods
| Method | Return Type | Use Case |
|---|---|---|
| Files.lines(Path) | Stream<String> | File की हर line को Stream के रूप में पढ़ना |
| BufferedReader.lines() | Stream<String> | BufferedReader से Stream बनाना |
Static Stream Methods Overview
Java Stream API कुछ predefined static methods भी देता है जो Stream creation में helpful हैं:
- Stream.of(T... values): दिए गए elements से Stream create करता है।
- Stream.empty(): Empty Stream बनाता है जब elements नहीं हैं।
- Stream.concat(stream1, stream2): दो Streams को merge करता है।
Example: Stream.of() Method
Stream<String> stream = Stream.of("Java", "Python", "C++");
stream.forEach(System.out::println);
Example: Stream.concat()
Stream<String> s1 = Stream.of("A", "B");
Stream<String> s2 = Stream.of("C", "D");
Stream<String> merged = Stream.concat(s1, s2);
merged.forEach(System.out::println);
यह तरीका तब काम आता है जब आपको multiple sources की data streams को एक साथ combine करना हो।
Exam and Interview Perspective
- Java में Stream creation के चार main sources हैं — Collections, Arrays, Generators, और I/O Channels।
stream()method Collections पर directly available है।Arrays.stream()method Arrays के लिए use होता है।Stream.generate()औरStream.iterate()dynamic Streams के लिए काम करते हैं।Files.lines()औरBufferedReader.lines()file-based Streams के लिए use होते हैं।Stream.of()static elements के लिए simple option है।
Exam point of view से अगर पूछा जाए कि “Stream कैसे बनाते हैं?” तो आपको इन सभी तरीकों का नाम और एक-एक short example याद रखना चाहिए। Interview में भी अक्सर practical example देने को कहा जाता है जैसे “List से Stream बनाओ और even numbers print करो”।
Important Notes (For Students)
- Stream एक data structure नहीं है, यह data process करने का एक functional way है।
- Streams original data को modify नहीं करतीं, बल्कि new Stream return करती हैं।
- Stream operations दो प्रकार के होते हैं — Intermediate (जैसे filter(), map()) और Terminal (जैसे collect(), forEach())।
- Streams memory efficient होती हैं क्योंकि ये lazy evaluation concept पर काम करती हैं।
- Parallel Streams large data sets को तेज़ी से process करने के लिए multi-core advantage देती हैं।
इस topic को अच्छे से समझना Java functional programming की नींव को मजबूत करता है। अगर आप B.Tech, MCA या किसी competitive exam की तैयारी कर रहे हैं, तो यह concept आपके syllabus में जरूर होता है। Practice के लिए कुछ basic programs खुद बनाइए और IDE में run करके देखें।