2016-07-13 5 views
7

कैसे, जावा -8 स्ट्रीम/लैम्बडास के साथ, क्या मुझे चाबियों द्वारा मानचित्रों की सूची का औसत मिल सकता है?जावा 8 लैम्बडास मानचित्रों की सूची का औसत ढूंढने के लिए

उदाहरण:

List<Map<String, Double>> users = Arrays.asList(
    new HashMap<String, Double>() 
    {{ 
     put("weight", 109.0); 
     put("height", 180.2);   
    }}, 
    new HashMap<String, Double>() 
    {{ 
     put("weight", 59.0); 
     put("height", 186.2);   
    }} 
); 

Map<String, Double> statistics = 
//<MISSED CODE with lambdas> (?) 

System.out.println(statistics); 
//{weight=84.0, height=183.1) 
वर्ष अच्छा foreachs यह काफी सरल, मैं सोच रहा हूँ कि अगर lambdas के साथ प्राप्त किया जा सकता के साथ

। मुझे इसकी आवश्यकता यह है कि मैं अपाचे स्पार्क और जावा -8 लैम्बडास का उपयोग करने जा रहा हूं इसके लिए एक और मानक दृष्टिकोण होगा।

+1

आप केवल 2 मान रखने के लिए एक नक्शा बना रहे हैं? – Andrew

+0

अच्छी तरह से, वास्तव में यह नक्शा नहीं है लेकिन स्कैला lib के Tuple4 है। फिलहाल 4 मान हैं, इसलिए आगे बढ़ने के कारण यह मामला नहीं है – Bogdan

+0

@Bogdan जब आप स्कैला का उपयोग कर रहे हैं तो आप जावा समाधान के लिए क्यों पूछ रहे हैं? – Flown

उत्तर

6

Andrew Tobilko ने कहा, आपको उचित डेटा संरचना का उपयोग करना चाहिए Map एस।

आप List<Map<>> के प्रयोग पर जोर देते हैं तो आप Map::entrySetStream::flatMap और उचित Collector रों उपयोग करने के लिए की जरूरत है।


List<Map<String, Double>> users = Arrays.asList(new HashMap<String, Double>() { 
    { 
    put("weight", 109.0); 
    put("height", 180.2); 
    } 
}, new HashMap<String, Double>() { 
    { 
    put("weight", 59.0); 
    put("height", 186.2); 
    } 
}); 

Map<String, Double> statistics = users.stream().flatMap(m -> m.entrySet().stream()) 
    .collect(
     Collectors.groupingBy(Entry::getKey, Collectors.averagingDouble(Entry::getValue)) 
    ); 

System.out.println(statistics); 
// {weight=84.0, height=183.2} 
संबंधित मुद्दे