2017-02-13 20 views
10

मेरे पास एक तरीका है जो एक सूची बनाता है और मैं इसे वैकल्पिक मान के रूप में सूची का औसत वापस करना चाहता हूं।वैकल्पिक वैकल्पिक से वैकल्पिक <java.lang.Double>

हालांकि, जब मैं जावा 8 का उपयोग कर औसत मान की गणना करता हूं, तो मुझे हमेशा वैकल्पिक विकल्प के रूप में वापसी मान मिलता है।

मैं कैसे परिवर्तित

OptionalDouble to Optional<Double>? 

औसत से गणना के लिए मेरी कोड हैं:

private static Optional<Double> averageListValue() { 
    // Build list 
    List<Double> testList = new ArrayList<>(); 
    testList.add(...); 
    ... 
    ... 


    return testList.stream().mapToDouble(value -> value).average(); 
} 

धन्यवाद।

+2

वैकल्पिक डबल पर 'getAsDouble' के बारे में' जो आपको 'डबल' में औसत मिलेगा जो आप अंत में चाहते हैं। – VHS

+3

एक वैकल्पिक डबल दो अधिक कुशल है; 'डबल' के नजदीक, इसलिए 'वैकल्पिक ' से 'वैकल्पिक डबल' तक उपयोग कोड को बेहतर बनाना बेहतर लगेगा। लेकिन फिर, मुझे लगता है कि आप जानते हैं और आपका कारण है। –

+2

यदि कोड दिखाए गए एक सूची बनाता है, तो आप पहले से ही जानते हैं कि यह कभी खाली नहीं होगा। तो क्यों एक 'वैकल्पिक' वापस लौट रहे हैं? – Holger

उत्तर

1

अगर वहाँ एक स्वच्छ समाधान मौजूद है मैं नहीं जानता, लेकिन चौथाई काम करना चाहिए:

OptionalDouble optionalDouble = testList.stream().mapToDouble(value -> value).average(); 
return Optional.ofNullable(optionalDouble.isPresent() ? optionalDouble.getAsDouble() : null); 
1

बस मस्ती के लिए, मैं देखने के लिए अगर यह एक एकल बयान में लिखा जा सकता है चाहता था, के लिए किसी भी आवश्यकता के बिना एक वैकल्पिक दोहरी अस्थायी चर।

return ((Function<OptionalDouble, Optional<Double>>) od 
      -> od.isPresent() ? Optional.of(od.getAsDouble()) : Optional.empty()) 
      .apply(testList.stream().mapToDouble(v -> v).average()); 

Btw, बस अतिसूक्ष्मवाद के लिए, यदि आप:

return testList.stream().collect(Collectors.collectingAndThen(
    Collectors.summarizingDouble(Double::doubleValue), 
    stat -> Optional.ofNullable(stat.getCount()>0 ? stat.getAverage() : null))); 
1

मैं इस "एक पंक्ति" (सिंगल स्टेटमेंट) समाधान के लिए आया था: यहाँ सबसे अच्छा मैं के साथ आया है स्थिर आयात करना होगा:

import static java.util.Optional.*; 

आप Optional. छोड़ सकते हैं, क्या यह एक छोटा सा कम गंदा बनाता है।

6

मैं इस दृष्टिकोण के लिए जाना चाहते हैं:

private static Optional<Double> convert(OptionalDouble od) 
{ 
    return od.isPresent() ? 
     Optional.of(od.getAsDouble()) : Optional.empty(); 
} 
4

Btw, मैं एक और समाधान है, जो सबसे सरल रूप है पाया।

मैंने इस बारे में सोचना शुरू कर दिया है: जब औसत का परिणाम खाली हो सकता है? केवल जब इसे सूचीबद्ध करें स्वयं खाली है, है ना? तो अगर हम यकीन है कि सूची, खाली नहीं है की तुलना में हम सुरक्षित रूप से getAsDouble() कर सकते हैं:

return Optional.ofNullable(testList.isEmpty() ? null : 
     testList.stream().mapToDouble(v -> v).average().getAsDouble()) 

(देखने का प्रदर्शन बिंदु से इस अतिरिक्त लैम्ब्डा रैपर बनाने की तुलना में अधिक कुशल हो सकता है के रूप में इसी तरह के सवालों के जवाब में सुझाव दिया गया था।)

if (testList.isEmpty()) { 
    return Optional.empty(); 
} 
return Optional.of(testList.stream().collect(Collector.averagingDouble())); 

या विचार करें कि क्या 0 एक खाली सूची के लिए एक वैध वापसी मान है, और पी:

+3

यह एक डबल-टेस्ट है, पहले 'isEmpty()', फिर 'शून्य' के भीतर 'शून्य' परीक्षण है। दूसरे परीक्षण की कोई आवश्यकता नहीं है: 'वापसी testList.isEmpty()? वैकल्पिक .empty(): वैकल्पिक। (TestList.stream()। MapToDouble (v -> v) .average()। GetAsDouble()); ' – Holger

+3

मैंने इसके बारे में सोचा, लेकिन मैंने विशेष रूप से 'वैकल्पिक' के अंदर टर्नरी ऑपरेशन रखा। ofNullable'। यह अधिक स्टाइलिश चीज है, जबकि मैं मानता हूं कि इसमें एक और तुलना ऑपरेशन है – Andremoniy

4

@Andremoniy's answer पर एक मामूली बदलाव DoubleStream छोड़ और averagingDouble() कलेक्टर का उपयोग करें ossibly Optional पूरी तरह से छोड़ दें।

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