2017-03-28 13 views
5

में कम करें मैं जावा में धाराओं का उपयोग करने के लिए नया हूं, इसलिए मेरा प्रश्न है। मेरे पास एक डबल [] [] है जिसमें मैं तत्वों का सारांश करना चाहता हूं, इसके लिए मुझे सीटीआई लिंक के समान अनुशासन और अपमान है, लेकिन ऐसा लगता है कि काम नहीं कर रहा है।2 डी ऐरे स्ट्रीम जावा

Arrays.stream(myArray).reduce(0,(acc, i) -> acc + Arrays.stream(i).sum()); 

त्रुटि यह है कि एसीसी एक डबल [] लगता है, इसलिए यह डबल [] + डबल नहीं कर सकता है। सी # लिंक में संचयक बीज (0 इस मामले में 0) के समान प्रकार माना जाता है। मुझे क्या याद आ रहा है अग्रिम धन्यवाद।

उत्तर

5

यदि आप reduce के हस्ताक्षर को देखते हैं, तो पहचान का प्रकार स्ट्रीम के तत्वों का प्रकार होना चाहिए। इस मामले में double[] होगा। इससे accdouble[] का प्रकार भी होगा।

एक अधिभार है जहां आप एक अलग प्रकार के संचयक की आपूर्ति कर सकते हैं, लेकिन आपको 2 accumulators को गठबंधन करने के लिए एक combiner पास करने की भी आवश्यकता है।

आप ऐसा कर सकते हैं:

double result = Arrays.stream(myArray) 
    .reduce(0D, (acc, i) -> acc + Arrays.stream(i).sum(), Double::sum); 

0D जहां एक double शाब्दिक है, और Double::sum 2 एक्युमुलेटरों गठबंधन करने के लिए प्रयोग किया जाता है।

वैकल्पिक रूप से, इसे और अधिक यह करने के लिए सुविधाजनक हो सकता है:

double result = Arrays.stream(myArray) 
    .flatMapToDouble(DoubleStream::of) 
    .sum(); 
+0

धन्यवाद बहुत से, अब मैं यह समझ है। – BoRDeX

+1

flatMap सबसे साफ दृष्टिकोण है। –

+0

मैं 'Arrays.stream (myArray) .flatMapToDouble (Arrays :: stream) .sum();' क्योंकि यह एक varargs उपयोग केस नहीं है। और 'Arrays :: stream'' DoubleStream :: of 'से भी छोटा है ... – Holger

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