toMap, joining और summarizing
streams को maps में बदलें, joining से strings को जोड़ें और summarizingInt से आँकड़े निकालें।
toMap, joining और summarizing, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
Collectors.toMap की मूल बातें
Collectors.toMap(keyMapper, valueMapper) stream को Map में बदलता है। प्रत्येक तत्व एक कुंजी-मान युग्म देता है।
import java.util.*;
import java.util.stream.*;
record Country(String code, String name) {}
List<Country> countries = List.of(
new Country("US","United States"),
new Country("DE","Germany"),
new Country("JP","Japan")
);
Map<String, String> codeToName =
countries.stream().collect(
Collectors.toMap(Country::code, Country::name)
);
System.out.println(codeToName.get("DE")); // Germanyडुप्लिकेट कुंजियों को संभालना
डुप्लिकेट कुंजियों पर toMap IllegalStateException उत्पन्न करता है। टकराव सुलझाने के लिए तीसरे तर्क के रूप में merge फ़ंक्शन दें:
List<String> words = List.of("apple","ant","banana","bat","cherry");
Map<Character, String> firstByLetter =
words.stream().collect(
Collectors.toMap(
w -> w.charAt(0),
w -> w,
(existing, replacement) -> existing // keep first
)
);
System.out.println(firstByLetter); // {a=apple, b=banana, c=cherry}मान बदलने के साथ toMap
value mapper कोई भी फ़ंक्शन हो सकता है—संग्रहित करने से पहले तत्व को बदलें:
record User(String login, String email) {}
List<User> users = List.of(
new User("alice","alice@example.com"),
new User("bob","bob@example.com")
);
Map<String, String> loginToEmail =
users.stream().collect(
Collectors.toMap(User::login, u -> u.email().toUpperCase())
);
System.out.println(loginToEmail.get("alice")); // ALICE@EXAMPLE.COMtoUnmodifiableMap
अपरिवर्तनीय Map बनाने के लिए Collectors.toUnmodifiableMap() का उपयोग करें—यह Collections.unmodifiableMap() में लपेटने के समकक्ष है, लेकिन अधिक साफ़ है:
Map<String, Integer> wordLengths =
Stream.of("Java","Stream","API")
.collect(Collectors.toUnmodifiableMap(w -> w, String::length));
// wordLengths.put("test",4); // throws UnsupportedOperationExceptionCollectors.joining
Collectors.joining() स्ट्रिंग तत्वों को जोड़ता है। इसमें वैकल्पिक विभाजक, उपसर्ग और प्रत्यय दिए जा सकते हैं:
List<String> names = List.of("Alice","Bob","Carol");
System.out.println(names.stream().collect(Collectors.joining()));
// AliceBobCarol
System.out.println(names.stream().collect(Collectors.joining(", ")));
// Alice, Bob, Carol
System.out.println(names.stream().collect(Collectors.joining(", ", "[", "]")));
// [Alice, Bob, Carol]CSV आउटपुट के लिए joining
joining की सहायता से CSV पंक्तियाँ या SQL IN क्लॉज़ बनाएँ:
List<Integer> ids = List.of(1,2,3,4,5);
String inClause = ids.stream()
.map(Object::toString)
.collect(Collectors.joining(",", "(", ")"));
System.out.println("WHERE id IN " + inClause);
// WHERE id IN (1,2,3,4,5)summarizingInt / Long / Double
Collectors.summarizingInt() एक ही पास में सभी आँकड़े निकालता है और IntSummaryStatistics लौटाता है:
record Product(String name, int price) {}
List<Product> products = List.of(
new Product("A",100), new Product("B",200), new Product("C",150)
);
IntSummaryStatistics stats =
products.stream().collect(Collectors.summarizingInt(Product::price));
System.out.println("Count: " + stats.getCount()); // 3
System.out.println("Sum: " + stats.getSum()); // 450
System.out.println("Min: " + stats.getMin()); // 100
System.out.println("Max: " + stats.getMax()); // 200
System.out.println("Avg: " + stats.getAverage()); // 150.0summingInt और averagingInt
उन सरल मामलों के लिए, जहाँ आपको केवल एक आँकड़ा चाहिए:
int total = products.stream().collect(Collectors.summingInt(Product::price));
System.out.println("Total: " + total); // 450
double avg = products.stream().collect(Collectors.averagingInt(Product::price));
System.out.println("Average: " + avg); // 150.0summarizingInt के साथ groupingBy
प्रत्येक समूह के लिए सारांश तैयार करने को संयोजित करें:
record Sale(String region, int amount) {}
List<Sale> sales = List.of(
new Sale("North",100), new Sale("South",200),
new Sale("North",150), new Sale("South",300)
);
Map<String, IntSummaryStatistics> statsByRegion =
sales.stream().collect(
Collectors.groupingBy(Sale::region,
Collectors.summarizingInt(Sale::amount))
);
statsByRegion.forEach((r,s) ->
System.out.printf("%s: sum=%d avg=%.1f%n", r, s.getSum(), s.getAverage()));LinkedHashMap में एकत्र करना
डिफ़ॉल्ट रूप से toMap एक HashMap बनाता है, जिसमें कोई निश्चित क्रम नहीं होता। प्रविष्टि-क्रम बनाए रखने के लिए LinkedHashMap निर्धारित करने हेतु चार-तर्क वाले ओवरलोड का उपयोग करें:
Map<String, Integer> ordered =
Stream.of("banana","apple","cherry")
.collect(Collectors.toMap(
w -> w,
String::length,
(a,b) -> a,
LinkedHashMap::new
));
System.out.println(ordered.keySet()); // [banana, apple, cherry]व्यावहारिक उदाहरण: कॉन्फ़िगरेशन पार्सर
toMap की सहायता से key=value वाली पंक्तियों को पार्स करके Map में बदलें:
List<String> lines = List.of("host=localhost","port=5432","db=myapp");
Map<String, String> config =
lines.stream()
.map(l -> l.split("=", 2))
.collect(Collectors.toMap(a -> a[0], a -> a[1]));
System.out.println(config.get("port")); // 5432त्वरित जाँच
आप ऐसे stream पर Collectors.toMap(k, v) का उपयोग करते हैं जिसमें समान कुंजी वाले दो तत्व हैं। क्या होगा?
पुनरावलोकन: toMap, joining, summarizing
मुख्य बातें:
- toMap(keyMapper, valueMapper)—merge फ़ंक्शन के बिना डुप्लिकेट कुंजियों पर अपवाद उत्पन्न करता है
- joining(delimiter, prefix, suffix)—स्ट्रिंग को सुंदर ढंग से जोड़ता है
- summarizingInt एक ही पास में संख्या+योग+न्यूनतम+अधिकतम+औसत देता है
- एकल आँकड़े की आवश्यकता के लिए summingInt/averagingInt का उपयोग करें
- क्रमबद्ध परिणामों के लिए LinkedHashMap::new के साथ चार-तर्क वाले toMap का उपयोग करें
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “toMap, joining और summarizing” पाठ निःशुल्क है?
हाँ—“toMap, joining और summarizing” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“toMap, joining और summarizing” में मैं क्या सीखूँगा?
streams को maps में बदलें, joining से strings को जोड़ें और summarizingInt से आँकड़े निकालें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“toMap, joining और summarizing” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- groupingBy: Elements का वर्गीकरण
- partitioningBy और counting
- toMap, joining और summarizing
- Custom Collector बनाना