2016-04-25 33 views
29

का उपयोग कर सूची में मूल्यों को गुणा कैसे करें धारा में एक योग (समकक्ष समतुल्य विधि है जो धारा में दिए गए मानों के गुणा को निष्पादित कर सकती है?जावा 8 स्ट्रीम

मैं इस तरह पूर्णांकों की एक सूची है:

List<Integer> listOfIntegers = new ArrayList<>(); 
listOfIntegers.addAll(Arrays.asList(1,4,2,7,5)); 

मैं एक एपीआई जो मूल्यों गुणा और उत्पादन दे सकते हैं खोजने के लिए सभी पूर्णांकों का योग प्राप्त करने में सक्षम है, लेकिन में असमर्थ हूँ।

listOfIntegers.stream().mapToInt(a -> a).sum(); 

अगर मैं यह करने के लिए foreach इस्तेमाल करने की कोशिश, तो मैं परिणाम के रूप में केवल अंतिम चर इसके अंदर इस्तेमाल किया जा करने की अनुमति है की दुकान नहीं कर सकते हैं।

क्या इसका कोई विकल्प है?

+0

इस लिंक को देखने के लिए आपको शायद अपना जवाब मिल जाएगा। http://codereview.stackexchange.com/questions/78484/multiplying-corresponding-integers-using-streams –

उत्तर

37

धाराओं को कम करने का प्रयास करें, इसे मदद करनी चाहिए।

तरह:

listOfIntegers.stream().reduce(1, (a, b) -> a * b) 

यह link कैसे कम उपयोग करने के बारे में अधिक जानकारी प्रदान करता है।

+6

बेशक, पहले मानों को बॉक्स करने की आवश्यकता नहीं है: 'IntStream.of (1,4,2,7 , 5) .reduce (1, (ए, बी) -> ए * बी) ' – Andreas

+0

@ एंड्रिया सहमत हैं। चूंकि सूची पहले से ही उपलब्ध थी, इसलिए मैंने स्ट्रीम का उपयोग किया। एंड्रैस के रूप में कार्तिक ने सुझाव दिया है कि यदि आपके पास मूल्य हैं तो आप सीधे इंटस्ट्रीम का उपयोग कर सकते हैं। –

+1

यदि आप 'वैकल्पिक' प्राप्त करने के साथ ठीक हैं, तो आप पहले तर्क को 'कम करें' पर छोड़ सकते हैं। – Zirak

28

ints की अज्ञात संख्या को गुणा करते समय ध्यान में रखना एक बात है अतिप्रवाह की संभावना है। बल्कि (a,b) -> a*b से, यह सुरक्षित है Math::multiplyExact, जो अतिप्रवाह पर एक अपवाद फेंक देते हैं उपयोग करने के लिए:

listOfIntegers.stream().mapToInt(x->x).reduce(1, Math::multiplyExact); 

वैकल्पिक रूप से, आप BigInteger पर कम करके बड़े परिणाम समायोजित कर सकते हैं: एक पहचान के साथ

listOfIntegers.stream() 
    .map(BigInteger::valueOf) 
    .reduce(BigInteger.ONE, BigInteger::multiply); 

कमी होगी यदि सूची खाली है, तो 1 या BigInteger.ONE वापस करें, जो आप चाहते हैं कि हो सकता है। यदि आप खाली सूची के मामले को संभालना चाहते हैं, तो पहले तर्क को reduce पर हटाएं और फिर परिणामस्वरूप Optional से निपटें।

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