2016-07-31 40 views
8

मैं स्ट्रीम के बारे में जानने की कोशिश कर रहा हूं और समस्या का सामना कर रहा हूं: मैं एक सूची का न्यूनतम मान प्राप्त करना चाहता हूं और इसे एक चर चर से असाइन करना चाहता हूं।जावा 8 स्ट्रीम "ifPresent"

List<Integer> list = new ArrayList<>(); 
    list.add(1); 
    list.add(2); 
    list.add(3); 
    int smallest = list.stream().min(Integer::compareTo).get(); 
    System.out.println(smallest); 

यह अच्छी तरह से काम करता है और मैं एक परिणाम के रूप 1 मिलती है: कि मैं निम्नलिखित किया था। मुद्दा यह है कि आईडीई चेतावनी देता है कि Optional.get को .isPresent की जांच करने से पहले बुलाया जाता है। ठीक करने के लिए मैं थोड़ा अलग ifPresent विधि का इस्तेमाल किया और कोशिश की है कि निम्नलिखित:

int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer); 

दुर्भाग्य से इस के बाद से मैं चेतावनी मिलती है काम नहीं करता: Bad return type in Lambda, Integer cannot be converted to void. मेरा प्रश्न अंत में है: मैं कैसे करने के लिए न्यूनतम मूल्य प्रदान कर सकते हैं int smallest वैरिएबल ifPresent की जांच के साथ?

+1

आपको सबसे पहले समझना होगा कि आपको वैकल्पिक क्यों मिलता है, न कि पूर्णांक: क्योंकि स्ट्रीम खाली हो सकती है, और इस प्रकार कोई न्यूनतम मूल्य नहीं हो सकता है। फिर आपको यह तय करने की ज़रूरत है कि यदि परिणाम खाली है तो परिणामस्वरूप आप क्या प्राप्त करना चाहते हैं। फिर, एक बार जब आप जानते हैं कि आप क्या चाहते हैं, तो आप वैकल्पिक परिणाम के दस्तावेज़ीकरण को देखकर उस परिणाम को प्राप्त करने का सही तरीका चुन सकेंगे। –

+1

'ifPresent'' उपभोक्ता 'को इसके तर्क के रूप में लेता है, जो इनपुट मान का उपभोग करता है और कुछ भी नहीं देता है। –

उत्तर

6

Stream#min परिणाम की वापसी Optional क्योंकि सामान्य धारा में खाली हो सकता है इसलिए कोई न्यूनतम मूल्य हो सकता है।

Optional<Integer> minimal = list.stream().min(Integer::compareTo); 

वैकल्पिक से मूल्य प्राप्त करने के लिए आप कुछ फ़ॉलबैक मान

Integer absent = Integer.MIN_VALUE; 

की आवश्यकता है सबसे आसान orElse

Integer smallest = minimal.orElse(absent); 

लिटिल बिट लंबे समय तक किया जाएगा उपयोग करने के लिए किया जाएगा isPresent

Integer smallest = minimal.isPresent() ? minimal.get() : absent; 
+0

तो ऑरसे विधि एक इंटीजर प्रकार देता है और नहीं .min विधि की तरह वैकल्पिक है? –

+1

हां, इस उदाहरण में यह 'इंटेगर' होगा। सामान्य रूप से 'वैकल्पिक ' में किसी भी प्रकार का मान 'टी' हो सकता है, इसलिए' या 'Ese' रिटर्न उस प्रकार का प्रकार' टी' –

+0

आपको बहुत धन्यवाद! –

7

यहाँ कैसे मैं यह कर करेंगे:

package lambdas; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by Michael 
* Creation date 7/31/2016. 
* @link https://stackoverflow.com/questions/38688119/java-8-streams-ifpresent 
*/ 
public class MinimumExample { 

    public static void main(String[] args) { 
     List<Integer> list = new ArrayList<>(); 
     int smallest = list.stream().min(Integer::compareTo).orElse(Integer.MIN_VALUE); 
     System.out.println(smallest); 
    } 
} 
+0

यदि '.min' विधि वैकल्पिक विकल्प देता है, तो '.orElse' विधि को एक पूर्णांक वापस करने की आवश्यकता होती है। क्या '.orElse'' .get' विधि को कॉल करता है? –

+0

यह कोड चलता है और काम करता है।आपके द्वारा स्वीकार किए गए उत्तर से इसे सेकेंड किया गया था। क्या पूछते हैं? – duffymo

1

ifPresent विधि पैरामीटर के रूप में Consumer<? super T> लेता है। बस बोलते हुए, यह return कथन के बिना एक कार्रवाई होनी चाहिए। यदि यह मौजूद है, तो आप

[...].ifPresent(System.out::print); 

पर विचार कर सकते हैं लेकिन आईडीईए के बारे में यह नहीं है। मुझे लगता है, तो आप बस एक Option<Integer> उदाहरण सहेजें और फिर उसे isPresent से यह जांच करने की आवश्यकता:

Optional<Integer> o = list.stream().min(Integer::compareTo); 
if (o.isPresent()) { 
    smallest = o.get(); 
} 
बेशक

, वहाँ orElse साथ और अधिक सुविधाजनक तरीके हैं:

smallest = o.orElse(Integer.MIN_VALUE); 

या त्रिगुट ऑपरेटर के साथ:

smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE; 
संबंधित मुद्दे