2016-05-20 21 views
5

के साथ एक ही समय में समेकित योग और योग-वर्गों की गणना करना मैं सोच रहा था कि सरणी पर एक ही पुनरावृत्ति के भीतर निम्न प्राप्त करने का कोई तरीका है या नहीं। बस धारा से दो अलग-अलग परिणाम प्राप्त करने के लिए।धारा

double sum = Arrays.stream(doubles).sum(); 
double sumOfSquares = Arrays.stream(doubles).map(d -> d * d).sum(); 
+3

यदि आपको लगता है कि आपको इन प्रकार के आंकड़ों की बहुत आवश्यकता है तो [डबलसमरीस्टैटिक्स] (https://docs.oracle.com/javase/8/docs/api/java/util/DoubleSummaryStatistics.html) को उपclassing समझ सकता है। – the8472

+2

संबंधित प्रश्न (@8472 से विचार का उपयोग करके) http://stackoverflow.com/questions/36263352/java-streams- मानक-deviation – Tunaki

+6

यहां अनुशंसित दृष्टिकोण वास्तव में 'DoubleSummaryStatistics' को उपclass करना है। उस ने कहा, सावधान रहें। हमने डीएसएस में समेकित वर्गों समेत विचार किया, लेकिन ऐसा नहीं चुना क्योंकि (ए) इसकी अधिक गणना जो कई उपयोगकर्ता चाहते हैं, लेकिन अधिक महत्वपूर्ण बात यह है कि (बी) संख्यात्मक समस्या के साथ संख्यात्मक परेशानी में होना बहुत आसान है, के वर्गों। (स्क्वायरिंग बड़ी संख्या में छोटी और छोटी संख्याएं छोटी बनाती है, जिससे आप उन्हें जोड़ते समय डेटा खोने का जोखिम लेते हैं।) अधिक जानकारी के लिए Knuth AOCP, वॉल्यूम 2, सेकंड 4.2.2 देखें। –

उत्तर

13
खैर

, आप एक कस्टम कलेक्टर के साथ कर सकता है, उदाहरण के लिए:

double[] res = 
    Arrays.stream(doubles) 
      .collect(() -> new double[2], 
        (arr, e) -> {arr[0]+=e; arr[1]+=e*e;}, 
        (arr1, arr2) -> {arr1[0]+=arr2[0]; arr1[1]+=arr2[1];}); 

double sum = res[0]; 
double sumOfSquares = res[1]; 

लेकिन आप मेरी राय में बहुत पठनीयता हासिल नहीं है, इसलिए मैं कई गुजरता समाधान के साथ छड़ी हैं (या शायद बस इस मामले में फॉर-लूप का उपयोग करें)।

+0

बहुत बहुत धन्यवाद! मैं अभी भी स्ट्रीम सीख रहा हूं, इसलिए यह वास्तव में सहायक है। – HectorBarbossa