जब संख्या 0 के बराबर हो, तो मैं एक सीमा के साथ सीमा (संख्या) को कैसे छोड़ सकता हूं?


19

मेरे पास कुछ जावा कोड हैं जो वस्तुओं को प्रदान करते हैं items। यह उन पर आधारित है maxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

यह ठीक से काम करता है, लेकिन सवाल यह है: क्या सीमित करने का एक तरीका है जब maxNumber == 0?

मुझे पता है कि मैं यह कर सकता था:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

लेकिन शायद एक बेहतर तरीका है, क्या आपके दिमाग में कुछ आता है?

जवाबों:


15

मैं मानता हूँ कि

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

चाल चलेगा, क्योंकि यह बहुत गैर संभावना है कि आप 2 ^ 63-1 तत्वों के साथ एक धारा से निपटने जा रहे हैं ...

कम से कम इस पर समानांतर धाराओं के साथ सावधान रहें ... एपीआई डॉक्स में एक नोट कहता है:

एपीआई नोट : limit()आम तौर पर अनुक्रमिक धारा पाइपलाइनों पर एक सस्ता संचालन होता है, यह ऑर्डर किए गए समानांतर पाइपलाइनों पर काफी महंगा हो सकता है, खासकर अधिकतम मान के बड़े मूल्यों के लिए ...


हाँ, यह चाल चली, धन्यवाद!
randomuser1

20

नहीं, स्ट्रीम पाइपलाइन वास्तव में पाइपलाइन के किसी भी हिस्से के आसपास छोड़ने की अनुमति नहीं देती है , इसलिए आपको चरणों के अंदर सशर्त तर्क के साथ काम करने के लिए मजबूर किया जाता है और limit()पाइप लाइन में हमेशा शामिल होता है, या उन हिस्सों में धारा का निर्माण करता है जो कि प्रश्न में if / else की तुलना में थोड़ा अधिक सुपाठ्य (IMHO)

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

यहाँ जैसे एक साधारण मामले में इससे बहुत फ़र्क नहीं पड़ता है, लेकिन आप अक्सर नियमित कोड संग्रहों को विधियों के माध्यम से पारित करते हुए, धाराओं में परिवर्तित और फिर संग्रह में वापस देखते हैं। ऐसे मामलों में कुछ हिस्सों में धाराओं के साथ काम करना एक बेहतर विचार हो सकता है जब तक कि आपको वास्तव में ज़रूरत न हो collect()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.