2016-04-01 6 views
15

मैं Map<String, BigDecimal> में प्रवेश करना चाहता हूं और हमेशा स्ट्रीम के बाहर से BigDecimal मान रखना चाहता हूं। इस प्रकारस्ट्रीम के बाहर एक मान का उपयोग कर जावा स्ट्रीम एपीआई के साथ एक नक्शा कैसे बनाएं?

BigDecimal samePrice; 
Set<String> set; 

set.stream().collect(Collectors.toMap(Function.identity(), samePrice)); 

हालांकि जावा शिकायत:

विधि toMap (फंक्शन, समारोह) प्रकार कलेक्टरों में तर्क के लिए लागू नहीं है (फंक्शन, BigDecimal)

क्यों क्या मैं बाहर से BigDecimal का उपयोग नहीं कर सकता? अगर मैं लिखता हूं:

et.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal())); 

यह काम करेगा, लेकिन यह निश्चित रूप से मैं नहीं चाहता हूं।

उत्तर

15

toMap(keyMapper, valueMapper) का दूसरा तर्क (पहले की तरह) एक ऐसा फ़ंक्शन है जो स्ट्रीम तत्व लेता है और मानचित्र का मान देता है।

इस मामले में, आप इसे अनदेखा करना चाहते हैं तो आप कर सकते हैं:

set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice)); 

ध्यान रखें कि आपके दूसरे प्रयास में एक ही कारण के लिए काम नहीं होता।

9

Collectors#toMap उम्मीद दो Functions

set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice)); 

आप JavaDoc

भीतर लगभग एक ही उदाहरण मिल सकते हैं
Map<Student, Double> studentToGPA 
    students.stream().collect(toMap(Functions.identity(), 
            student -> computeGPA(student))); 
6

, आप एक समारोह निर्दिष्ट करने की आवश्यकता के रूप में पहले से ही अन्य उत्तर में कहा जो प्रत्येक तत्व को निश्चित मान पर element -> samePrice पर मानचित्र करता है।

एक अतिरिक्त के रूप में, यदि आप विशेष रूप से एक ConcurrentHashMap भरना चाहते हैं, वहाँ एक साफ विशेषता यह है कि सब पर एक धारा आपरेशन की जरूरत नहीं है है:

ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>(); 
map.keySet(samePrice).addAll(set); 

दुर्भाग्य से, वहाँ मनमाना Map के लिए ऐसी कोई ऑपरेशन है रों।

संबंधित मुद्दे