Google अमरूद में एक विधेय है जो हमेशा लौटता हैtrue
। क्या Java 8 में इसके लिए कुछ समान है Predicate
? मुझे पता है कि मैं उपयोग कर सकता हूं (foo)->{return true;}
, लेकिन मुझे कुछ पूर्व-निर्मित, अनुरूप होना चाहिए Collections.emptySet()
।
Google अमरूद में एक विधेय है जो हमेशा लौटता हैtrue
। क्या Java 8 में इसके लिए कुछ समान है Predicate
? मुझे पता है कि मैं उपयोग कर सकता हूं (foo)->{return true;}
, लेकिन मुझे कुछ पूर्व-निर्मित, अनुरूप होना चाहिए Collections.emptySet()
।
जवाबों:
Java 8 में कोई बिल्ट-इन हमेशा-सच और हमेशा-गलत भविष्यवाणी नहीं होती है। इनको लिखने का सबसे संक्षिप्त तरीका है
x -> true
तथा
x -> false
इनसे तुलना करें
Predicates.alwaysTrue() // Guava
और अंत में एक अनाम आंतरिक वर्ग के लिए:
new Predicate<Object>() {
public boolean test(Object x) {
return true;
}
}
संभवतः इसका कारण यह है कि अमरूद में इन अंतर्निहित विधेय हैं कि एक अनाम आंतरिक वर्ग पर एक स्थिर विधि कॉल का एक बहुत बड़ा वाक्यात्मक लाभ है। जावा 8 में, लैम्ब्डा सिंटैक्स इतना संक्षिप्त है कि एक स्टेटिक मेथड कॉल को लिखने के लिए एक सिंटैक्टिक नुकसान है।
यह सिर्फ एक सिंटैक्टिक तुलना है, हालांकि। कई वैश्विक x -> true
वर्गों में फैली घटनाओं की तुलना में, यदि एक ही वैश्विक हमेशा-सच विधेय होता है, तो शायद एक छोटा सा स्थान लाभ है , जिनमें से प्रत्येक अपने स्वयं के विधेय उदाहरण का निर्माण करेगा। क्या यह आपके बारे में चिंतित है? बचत सम्मोहक प्रतीत नहीं हुई, शायद यही वजह है कि उन्हें पहले स्थान पर नहीं जोड़ा गया। लेकिन भविष्य में रिलीज के लिए इस पर पुनर्विचार किया जा सकता है।
अद्यतन 2015-04-24
हम स्थिर की एक किस्म के अलावा माना जाता है, इस तरह के रूप में नामित किया कार्यों Predicate.alwaysTrue
, Runnable.noop
आदि, और हम जावा SE के भविष्य के संस्करणों में किसी भी अधिक जोड़ने के लिए नहीं करने का फैसला किया है।
निश्चित रूप से किसी चीज में कुछ मूल्य होता है जिसका एक नाम बनाम लिखित लाम्बा होता है, लेकिन यह मान काफी छोटा होता है। हमें उम्मीद है कि लोगों को सीखना होगा पढ़ने के लिए कैसे और लिखने x -> true
और () -> { }
और उनके उपयोग मुहावरेदार हो जाएगा कि। यहां तक कि Function.identity()
ओवर x -> x
का मूल्य संदिग्ध है।
एक लिखित समारोह के मूल्यांकन के बजाय किसी मौजूदा फ़ंक्शन का पुन: उपयोग करने के लिए एक छोटा सा प्रदर्शन लाभ है, लेकिन हम इन प्रकार के कार्यों के उपयोग को इतना छोटा होने की उम्मीद करते हैं कि ऐसा लाभ नगण्य होगा, निश्चित रूप से एपीआई ब्लोट के लायक नहीं है।
होल्गर ने टिप्पणियों में उल्लेखित रचनाओं जैसे कि Predicate.or
और इस तरह के अनुकूलन की संभावना का भी उल्लेख किया है । यह भी माना जाता था ( JDK-8067971 ) लेकिन कुछ हद तक नाजुक और त्रुटि-रहित माना जाता था, और यह पर्याप्त रूप से घटित होता था कि इसे लागू करने के प्रयास के लायक नहीं था।
यह लैंबडा एफएक्यू प्रविष्टि भी देखें ।
Predicate.alwaysTrue()
आप के साथ भी गलती से लिख सकते हैं Predicate.alwaysFalse()
।
alwaysTrue()
और alwaysFalse()
। वास्तविक लंबोदर के साथ, मेरे पास कई विविधताएं हैं; मैं अनिवार्य रूप से हर बार सूत्र का पुनर्निर्माण कर रहा हूं। संक्षेप में, alwaysTrue()
मैं जो करना चाहता हूं , उसके लिए एक अर्थ लेबल है; x->true
वास्तव में हर बार फिर से कर रहा है। विशाल नहीं, लेकिन एक विचार।
Predicate.alwaysTrue()
और Predicate.alwaysFalse()
उदाहरणों है कि वे की तरह तरीकों के संयोजन के द्वारा मान्यता प्राप्त किया जा सकता है, है Predicate.or
, Predicate.and
और Predicate.negate()
। यह Predicate
चर के साथ पूर्व-आरंभ करने alwaysTrue()
और and
ओवरहेड के माध्यम से संयोजन करके विधेय जोड़ने की अनुमति देगा । चूंकि लैम्ब्डा के भावों की कोई वस्तु पहचान की गारंटी नहीं है, इसलिए यह विफल हो सकता है x->true
। वैसे, अगर मैं एक वर्ग है X
एक साथ static
विधि y(){return true;}
, का उपयोग कर X::y
से भी कम है x->true
वास्तव में सिफारिश की लेकिन नहीं ...
x -> true
यह नुकसान है कि मुझे बिना उपयोग के एक चर का उपयोग करना है। यह अनावश्यक मस्तिष्क भार और मेरी आईडीई में एक चेतावनी भी बनाता है। मैंने उपयोग करने की कोशिश की _ -> true
, लेकिन यह एक वाक्यविन्यास त्रुटि है। जावा निश्चित रूप से "अप्रयुक्त पैरामीटर" के लिए एक कीवर्ड (रीड: कीलर) को याद कर रहा है। आशा है कि ऐसा कुछ जावा 9 (या कम से कम: जावा में जो भी मेरे मरने से पहले आएगा ^ ^)
बिना अमरूद के
Boolean.TRUE::booleanValue
Predicate
, क्योंकि यह एक तर्क नहीं लेता है।
(foo)->{return true;}
सबसे अच्छा मैं कर सकता हूं, तो मैं बेहतर चाहता हूं। लेकिन आप लाए हैंx->true
, जो बहुत बेहतर है और पहले मुद्दे को कम करता है। दूसरा मुद्दा तर्क बनाम स्थिर घोषणा का है। यदि मैं उपयोग करता हूंx->true
, तो अभी भी तर्क शामिल है, जिसे मैं अनजाने में खराब कर सकता हूं (जैसेx->!true
)। लेकिनPredicate.alwaysTrue()
, तर्क त्रुटि के लिए शून्य कमरा है, क्योंकि केवल एक या दो समान तरीके हैं। साथ ही मुझे आईडीई कोड मुफ्त में पूरा हो रहा है।x->true
लगभग ठीक है, लेकिन मैंने अभी भीPredicate.alwaysTrue()
उपरोक्त कारणों के लिए एक विधि लिखी है ।