मैं जावा स्ट्रीम के बारे में पढ़ रहा हूं और जैसे-जैसे आगे बढ़ता हूं, नई चीजों की खोज करता हूं। मैंने पाया कि नई चीजों में से एक peek()
समारोह था । लगभग हर चीज जो मैंने झांकने पर पढ़ी है, कहती है कि इसका उपयोग आपकी स्ट्रीम को डीबग करने के लिए किया जाना चाहिए।
क्या होगा यदि मेरे पास एक स्ट्रीम है जहां प्रत्येक खाते में एक उपयोगकर्ता नाम, पासवर्ड फ़ील्ड और एक लॉगिन () और लॉग इन () विधि है।
मेरे पास भी है
Consumer<Account> login = account -> account.login();
तथा
Predicate<Account> loggedIn = account -> account.loggedIn();
यह इतना बुरा क्यों होगा?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
अब जहां तक मैं बता सकता हूं कि यह वही है जो यह करने का इरादा है। यह;
- खातों की एक सूची लेता है
- प्रत्येक खाते में प्रवेश करने की कोशिश करता है
- ऐसे किसी भी खाते को फ़िल्टर करता है जो लॉग इन नहीं है
- लॉग इन खातों को एक नई सूची में एकत्रित करता है
ऐसा कुछ करने का नकारात्मक पक्ष क्या है? किसी भी कारण से मुझे आगे नहीं बढ़ना चाहिए? अन्त में, यदि यह समाधान नहीं है तो क्या है?
इस के मूल संस्करण ने .filter () विधि का उपयोग इस प्रकार किया;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
हो सकता है कि आप जिस ऑपरेशन का विरोध करना चाहते हैं peek
। सिर्फ इसलिए कि एपीआई में इसका मतलब यह नहीं है कि यह दुरुपयोग (जैसे Optional.of
) के लिए खुला नहीं है ।
.peek(Account::login)
और .filter(Account::loggedIn)
; उपभोक्ता और विधेय लिखने का कोई कारण नहीं है कि जैसे कोई दूसरी विधि कहता है।
forEach()
और peek()
, केवल साइड-इफेक्ट्स के माध्यम से संचालित हो सकती है; इनका उपयोग देखभाल के साथ किया जाना चाहिए। "। मेरी टिप्पणी यह याद दिलाने के लिए अधिक थी कि peek
ऑपरेशन (जो डीबगिंग उद्देश्यों के लिए डिज़ाइन किया गया है) को उसी तरह के ऑपरेशन के अंदर एक ही काम करके प्रतिस्थापित नहीं किया जाना चाहिए map()
या जैसे filter()
।