प्रौद्योगिकी साझेदारी

जावा स्ट्रीम एपिआइ इत्यस्य विस्तृतव्याख्या: संग्रहदत्तांशस्य कुशलसंसाधनार्थं शक्तिशाली साधनम्

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

आमुख

जावा ८ अनेकानि नूतनानि विशेषतानि प्रवर्तयति, येषु सर्वाधिकं उल्लेखनीयं भवति Lambda expressions तथा Stream API इति । Stream API संग्रहदत्तांशसंसाधितुं कुशलं संक्षिप्तं च पद्धतिं प्रदाति, यत् कोडं अधिकं संक्षिप्तं स्पष्टं च करोति, तथा च उच्चपठनीयता, परिपालनक्षमता च भवति अयं लेखः जावा स्ट्रीम एपिआइ इत्यस्य उपयोगे गहनतया गमिष्यति, यत्र मूलभूतसंकल्पनाः, सामान्यसञ्चालनानि, समानान्तरप्रक्रियाकरणं, व्यावहारिकप्रकरणाः, उत्तमप्रथाः च सन्ति ।

विषयवस्तुसारणी

  1. Stream API इति किम्
  2. Stream API इत्यस्य मूलभूताः कार्याणि
  3. Stream API इत्यस्य उन्नतसञ्चालनम्
  4. समानान्तर धारा
  5. स्ट्रीम एपिआइ व्यावहारिक प्रकरण
  6. स्ट्रीम एपिआइ कृते उत्तमाः अभ्यासाः
  7. बहुधा पृष्टाः प्रश्नाः समाधानं च
  8. सारांशं कुरुत

Stream API इति किम्

Stream API इति संग्रहदत्तांशसंसाधनार्थं जावा 8 इत्यस्मिन् प्रवर्तितं अमूर्तं यत् घोषणात्मकरूपेण (SQL कथनानां सदृशं) आँकडानां संसाधनं कर्तुं अनुमतिं ददाति Stream API अनेकानि शक्तिशालिनः कार्याणि प्रदाति येषां उपयोगेन संग्रहेषु छानयितुं, क्रमबद्धुं, नक्शाङ्कयितुं, न्यूनीकर्तुं अन्ये च कार्याणि कर्तुं शक्यन्ते, येन कोडः बहु सरलः भवति ।

गुणाः

  • घोषणात्मक प्रोग्रामिंग: घोषणात्मकरूपेण कोडं लिखितुं Stream API इत्यस्य उपयोगं कुर्वन्तु, बॉयलरप्लेट् कोडं न्यूनीकरोति ।
  • श्रृङ्खला आह्वान: Stream API इत्यस्य कार्याणि श्रृङ्खलायां आह्वयितुं शक्यन्ते, येन कोडस्य पठनीयतायां सुधारः भवति ।
  • आलस्य मूल्याङ्कनम्: मध्यवर्ती-सञ्चालनस्य आलस्येन मूल्याङ्कनं भवति, तदा एव मूल्याङ्कनं भवति यदा टर्मिनल-सञ्चालनं क्रियते ।
  • समानान्तर प्रसंस्करण: समानान्तरप्रक्रियाकरणस्य समर्थनं करोति बहु-कोर-सीपीयू-इत्यस्य पूर्णं लाभं ग्रहीतुं शक्नोति ।

Stream API इत्यस्य मूलभूताः कार्याणि

धारा रचयतु

Stream API इत्यनेन Stream इत्यस्य निर्माणस्य विविधाः उपायाः प्रदत्ताः सन्ति ।

  1. संग्रहात् रचयतु
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
  • 1
  • 2
  1. सरणीतः रचयन्तु
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
  • 1
  • 2
  1. उपयुञ्जताम्‌Stream.of
Stream<String> stream = Stream.of("a", "b", "c");
  • 1
  1. उपयुञ्जताम्‌Stream.generate
Stream<Double> stream = Stream.generate(Math::random).limit(10);
  • 1
  1. उपयुञ्जताम्‌Stream.iterate
Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);
  • 1

मध्यवर्ती संचालन

Stream परिवर्तनार्थं मध्यवर्तीक्रियाणां उपयोगः भवति तथा च आलस्येन मूल्याङ्कनं भवति सामान्यमध्यवर्तीकार्यक्रमेषु निम्नलिखितम् अन्तर्भवति ।

  1. filter: तत्त्वानां छाननाय प्रयुक्तम् ।
Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));
  • 1
  1. map: प्रत्येकं तत्त्वं तत्सम्बद्धं परिणामं प्रति मैप् कर्तुं प्रयुक्तम् ।
Stream<String> stream = list.stream().map(String::toUpperCase);
  • 1
  1. flatMap: प्रत्येकं तत्त्वं Stream मध्ये परिवर्तयितुं ततः एकस्मिन् Stream मध्ये विलीनीकरणाय उपयुज्यते ।
Stream<String> stream = list.stream().flatMap(s -> Stream.of(s.split("")));
  • 1
  1. distinct: द्वितीयकं दूरीकर्तुं प्रयुक्तम्।
Stream<String> stream = list.stream().distinct();
  • 1
  1. sorted: क्रमणार्थं प्रयुक्तम् ।
Stream<String> stream = list.stream().sorted();
  • 1
  1. peek: प्रसंस्करणकाले प्रत्येकं तत्त्वं द्रष्टुं प्रयुक्तम् ।
Stream<String> stream = list.stream().peek(System.out::println);
  • 1

टर्मिनल संचालन

Stream इत्यस्य गणनां आरभ्य परिणामं जनयितुं टर्मिनल्-सञ्चालनानां उपयोगः भवति ।

  1. forEach: प्रत्येकं तत्त्वे एकं ऑपरेशनं कुर्वन्तु।
list.stream().forEach(System.out::println);
  • 1
  1. collect: Stream इत्येतत् अन्यरूपेण परिवर्तयन्तु।
List<String> result = list.stream().collect(Collectors.toList());
  • 1
  1. reduce: Stream इत्यस्मिन् तत्त्वानि मूल्ये न्यूनीकरोतु ।
Optional<String> result = list.stream().reduce((s1, s2) -> s1 + s2);
  • 1
  1. toArray:Stream इत्येतत् array इत्यत्र परिवर्तयन्तु ।
String[] array = list.stream().toArray(String[]::new);
  • 1
  1. count: तत्त्वानां संख्यां गणयतु।
long count = list.stream().count();
  • 1
  1. anyMatchallMatchnoneMatch: मेलनिर्णयस्य कृते प्रयुक्तम्।
boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("a"));
boolean allMatch = list.stream().allMatch(s -> s.startsWith("a"));
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("a"));
  • 1
  • 2
  • 3
  1. findFirstfindAny: तत्त्वान् अन्वेष्टुं प्रयुक्तम्।
Optional<String> first = list.stream().findFirst();
Optional<String> any = list.stream().findAny();
  • 1
  • 2

Stream API इत्यस्य उन्नतसञ्चालनम्

प्रकारं

उपयुञ्जताम्‌sortedविधिः Stream क्रमेण क्रमयति तथा च तुलनात्मके पारयितुं शक्नोति ।

List<String> list = Arrays.asList("b", "c", "a");
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
// 逆序排序
List<String> sortedListDesc = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
  • 1
  • 2
  • 3
  • 4

फ़िल्टर

उपयुञ्जताम्‌filterStream इत्यस्मिन् तत्त्वानि छानयितुं विधिः ।

List<String> list = Arrays.asList("a", "b", "c");
List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
  • 1
  • 2

मानचित्रणम्

उपयुञ्जताम्‌mapविधिः Stream इत्यस्मिन् तत्त्वानां नक्शाङ्कनं करोति ।

List<String> list = Arrays.asList("a", "b", "c");
List<String> mappedList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
  • 1
  • 2

विधानम्

उपयुञ्जताम्‌reduceStream इत्यस्मिन् तत्त्वानि न्यूनीकर्तुं विधिः ।

List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream().reduce("", (s1, s2) -> s1 + s2);
  • 1
  • 2

संग्रह

उपयुञ्जताम्‌collectविधिः Stream इत्येतत् अन्यरूपेण परिवर्तयति ।

List<String> list = Arrays.asList("a", "b", "c");
List<String> collectedList = list.stream().collect(Collectors.toList());
Set<String> collectedSet = list.stream().collect(Collectors.toSet());
String joinedString = list.stream().collect(Collectors.joining(","));
  • 1
  • 2
  • 3
  • 4

समानान्तर धारा

Parallel Stream बहु-कोर CPUs इत्यस्य लाभस्य पूर्णं उपयोगं कृत्वा आँकडासंसाधनदक्षतां सुधारयितुम् अर्हति ।उपयोक्तुं शक्नोतिparallelStreamविधिः समानान्तरं Stream निर्माति ।

List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());
  • 1
  • 2

अपि उपयोक्तुं शक्यतेparallelविधिः सामान्यं Stream समानान्तरं Stream मध्ये परिवर्तयति ।

List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.stream().parallel().map(String::toUpperCase).collect(Collectors.toList());
  • 1
  • 2

ज्ञातव्यं यत् parallel Stream सर्वदा serial Stream इत्यस्मात् द्रुततरं न भवति, विशिष्टस्थित्यानुसारं तस्य परीक्षणस्य आवश्यकता भवति ।

स्ट्रीम एपिआइ व्यावहारिक प्रकरण

संग्रहदत्तांशसंसाधनम्

प्रकरणम् १ : संग्रहान् छानयित्वा परिवर्तनं कुर्वन्तु

स्ट्रिंग्-सङ्ग्रहं दत्त्वा, येषां स्ट्रिंग्-दीर्घता 3 तः न्यूना भवति, तान् फ़िल्टर कृत्वा शेष-स्ट्रिंग्-इत्येतत् बृहत्-अक्षर-रूपेण परिवर्तयन्तु ।

List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
List<String> result = list.stream()
    .filter(s -> s.length() >= 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());
System.out.println(result); // 输出:[ABC, ABCD]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
प्रकरणम् २ : औसतस्य गणनां कुरुत

पूर्णाङ्कानां समुच्चयं दत्त्वा सर्वेषां पूर्णाङ्कानां औसतं गणयन्तु ।

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average = list.stream()
    .mapToInt(Integer::intValue)
    .average();
average.ifPresent(System.out::println); // 输出:3.0
  • 1
  • 2
  • 3
  • 4
  • 5

सञ्चिकासञ्चालनम्

प्रकरणम् ३ : सञ्चिकासामग्री पठन्तु

Stream API इत्यस्य उपयोगः

सञ्चिकायाः ​​सामग्रीं पठन्तु, कन्सोल् प्रति निर्गमं च कुर्वन्तु ।

try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}
  • 1
  • 2
  • 3
  • 4
  • 5
प्रकरणम् ४ : शब्दप्रसङ्गानां संख्यां गणयन्तु

सञ्चिकासामग्री पठित्वा प्रत्येकस्य शब्दस्य आवृत्तीनां संख्यां गणयन्तु ।

try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
    Map<String, Long> wordCount = lines
        .flatMap(line -> Arrays.stream(line.split("\W+")))
        .collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
    wordCount.forEach((word, count) -> System.out.println(word + ": " + count));
} catch (IOException e) {
    e.printStackTrace();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

दत्तांशकोश संचालन

प्रकरणम् ५: दत्तांशकोशप्रश्नपरिणामानां संसाधनम्

अस्माकं कृते database table अस्ति इति वदामःusers, क्षेत्राणि युक्तम्idnameतथाage . प्रश्नपरिणामानां संसाधनार्थं वयं Stream API इत्यस्य उपयोगं कर्तुं शक्नुमः ।

List<User> users = queryDatabase();
List<String> names = users.stream()
    .filter(user -> user.getAge() > 18)
    .map(User::getName)
    .collect(Collectors.toList());
System.out.println(names);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

स्ट्रीम एपिआइ कृते उत्तमाः अभ्यासाः

  1. अनावश्यकं समानान्तरीकरणं परिहरन्तु: Parallel Stream सर्वदा द्रुततरं न भवति, तस्य चयनं प्रकरण-प्रकरण-आधारेण करणीयम् ।
  2. मध्यवर्ती-सञ्चालनस्य, टर्मिनल-सञ्चालनस्य च सम्यक् उपयोगः: मध्यवर्ती-सञ्चालनस्य आलस्येन मूल्याङ्कनं भवति, तदा एव मूल्याङ्कनं भवति यदा टर्मिनल-सञ्चालनं क्रियते ।
  3. Stream इत्यस्य पुनः उपयोगाय ध्यानं ददातु: एकदा Stream उपभोक्तुं शक्यते तर्हि पुनः तस्य उपयोगः कर्तुं न शक्यते यदि भवान् तस्य पुनः उपयोगं कर्तुं प्रवृत्तः अस्ति तर्हि भवान् Stream इत्यस्य उपयोगात् पूर्वं संग्रहे परिवर्तनं कर्तुं विचारयितुं शक्नोति ।
  4. सम्यक् संग्राहकस्य उपयोगं कुर्वन्तुCollectorsवर्गे विविधाः संग्राहकाः प्रदत्ताः सन्ति, विशिष्टापेक्षानुसारं भवान् समुचितं संग्राहकं चिन्वितुं शक्नोति ।
  5. अपवादं सम्पादयन्तु: Stream API इत्यस्य उपयोगं कुर्वन् भवद्भिः सम्भाव्य अपवादाः सम्पादयितुं आवश्यकाः, विशेषतः सञ्चिकासञ्चालनेषु, दत्तांशकोशसञ्चालनेषु च ।

बहुधा पृष्टाः प्रश्नाः समाधानं च

धारा निरुद्धा भवति

एकदा Stream उपभोक्तं जातं चेत् पुनः तस्य उपयोगः कर्तुं न शक्यते यदि भवान् तस्य पुनः उपयोगं कर्तुं प्रवृत्तः अस्ति तर्हि भवान् Stream इत्यस्य उपयोगात् पूर्वं संग्रहे परिवर्तनं कर्तुं विचारयितुं शक्नोति ।

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出IllegalStateException
  • 1
  • 2
  • 3
  • 4

कार्यप्रदर्शनस्य विषयाः

समानान्तर धाराः सर्वदा क्रमिकधाराणाम् अपेक्षया द्रुततराः न भवन्ति, तेषां परीक्षणं प्रकरण-प्रकरण-आधारेण करणीयम् ।उपयोक्तुं शक्नोतिForkJoinPoolसमानान्तर Stream इत्यस्य कार्यक्षमतां अनुकूलितुं ।

ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() ->
    list.parallelStream().forEach(System.out::println)
).get();
  • 1
  • 2
  • 3
  • 4

स्मृति लीक

बृहत् परिमाणं दत्तांशं संसाधितुं Stream API इत्यस्य उपयोगं कुर्वन् भवद्भिः स्मृति-लीक-समस्यायां ध्यानं दातव्यम् ।उपयोक्तुं शक्नोतिcloseविधिः Stream बन्दं कर्तुं, अथवा उपयोगं कर्तुंtry-with-resourcesstatement स्वयमेव Stream बन्दं करोति ।

try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}
  • 1
  • 2
  • 3
  • 4
  • 5

सारांशं कुरुत

अस्मिन् लेखे जावा स्ट्रीम एपिआइ इत्यस्य उपयोगस्य विस्तरेण परिचयः कृतः, यत्र मूलभूतसञ्चालनम्, उन्नतसञ्चालनम्, समानान्तरप्रक्रियाकरणं, व्यावहारिकप्रकरणाः, उत्तमप्रथाः च सन्ति । Stream API इत्यस्य तर्कसंगतरूपेण उपयोगं कृत्वा विकासकाः कोडस्य बहु सरलीकरणं, कोडस्य पठनीयतां, परिपालनक्षमतां च सुधारयितुम्, आँकडासंसाधनस्य कार्यक्षमतां च सुधारयितुं शक्नुवन्ति आशासे यत् एषः लेखः भवतः जावा विकासे Stream API इत्यस्य उपयोगाय सहायकः भविष्यति।

जावा स्ट्रीम एपिआइ संग्रहदत्तांशसंसाधनार्थं एकं शक्तिशाली साधनम् अस्ति विभिन्नसञ्चालनानां लचीलप्रयोगद्वारा कुशलदत्तांशसंसाधनं स्ट्रीमिंगगणना च प्राप्तुं शक्यते । यदि भवान् Stream API इत्यस्य उपयोगं न कृतवान् तर्हि यथाशीघ्रं एतत् शक्तिशाली साधनं ज्ञात्वा निपुणतां प्राप्तुं अनुशंसितं भवति तथा च विकासदक्षतां कोडगुणवत्तां च सुधारयितुम् स्वस्य परियोजनायां प्रयोक्तुं शक्यते