अंतर्निहित जावा 8 हमेशा सही रिटर्न देने की भविष्यवाणी करता है?


129

Google अमरूद में एक विधेय है जो हमेशा लौटता हैtrue । क्या Java 8 में इसके लिए कुछ समान है Predicate? मुझे पता है कि मैं उपयोग कर सकता हूं (foo)->{return true;}, लेकिन मुझे कुछ पूर्व-निर्मित, अनुरूप होना चाहिए Collections.emptySet()

जवाबों:


162

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 ) लेकिन कुछ हद तक नाजुक और त्रुटि-रहित माना जाता था, और यह पर्याप्त रूप से घटित होता था कि इसे लागू करने के प्रयास के लायक नहीं था।

यह लैंबडा एफएक्यू प्रविष्टि भी देखें ।


14
दो चिंताएँ: पहली संक्षिप्तता है। अगर (foo)->{return true;}सबसे अच्छा मैं कर सकता हूं, तो मैं बेहतर चाहता हूं। लेकिन आप लाए हैं x->true, जो बहुत बेहतर है और पहले मुद्दे को कम करता है। दूसरा मुद्दा तर्क बनाम स्थिर घोषणा का है। यदि मैं उपयोग करता हूं x->true, तो अभी भी तर्क शामिल है, जिसे मैं अनजाने में खराब कर सकता हूं (जैसे x->!true)। लेकिन Predicate.alwaysTrue(), तर्क त्रुटि के लिए शून्य कमरा है, क्योंकि केवल एक या दो समान तरीके हैं। साथ ही मुझे आईडीई कोड मुफ्त में पूरा हो रहा है। x->trueलगभग ठीक है, लेकिन मैंने अभी भी Predicate.alwaysTrue()उपरोक्त कारणों के लिए एक विधि लिखी है ।
गैरेट विल्सन

10
@GarretWilson लेकिन Predicate.alwaysTrue()आप के साथ भी गलती से लिख सकते हैं Predicate.alwaysFalse()
डेविड कॉनरैड

5
@DavidConrad, बिल्कुल। हमेशा ऐसे तरीके होते हैं जिनसे मैं गलतियाँ कर सकता हूँ, और वास्तव में मैं लगातार नए आविष्कार कर रहा हूँ। ;) मैं कुछ तुच्छ पर यहाँ एक तर्क शुरू नहीं करना चाहता, लेकिन मैं सिर्फ इतना कहूंगा कि मेरी बात यह है कि एक स्थिर विधि संदर्भ के साथ मेरे पास केवल दो विकल्पों के साथ एक विवश शब्दावली है: alwaysTrue()और alwaysFalse()। वास्तविक लंबोदर के साथ, मेरे पास कई विविधताएं हैं; मैं अनिवार्य रूप से हर बार सूत्र का पुनर्निर्माण कर रहा हूं। संक्षेप में, alwaysTrue()मैं जो करना चाहता हूं , उसके लिए एक अर्थ लेबल है; x->trueवास्तव में हर बार फिर से कर रहा है। विशाल नहीं, लेकिन एक विचार।
गैरेट विल्सन

25
विहित में से एक बड़ा लाभ Predicate.alwaysTrue()और Predicate.alwaysFalse()उदाहरणों है कि वे की तरह तरीकों के संयोजन के द्वारा मान्यता प्राप्त किया जा सकता है, है Predicate.or, Predicate.andऔर Predicate.negate()। यह Predicateचर के साथ पूर्व-आरंभ करने alwaysTrue()और andओवरहेड के माध्यम से संयोजन करके विधेय जोड़ने की अनुमति देगा । चूंकि लैम्ब्डा के भावों की कोई वस्तु पहचान की गारंटी नहीं है, इसलिए यह विफल हो सकता है x->true। वैसे, अगर मैं एक वर्ग है Xएक साथ staticविधि y(){return true;}, का उपयोग कर X::yसे भी कम है x->trueवास्तव में सिफारिश की लेकिन नहीं ...
होल्गर

10
मुहावरा x -> trueयह नुकसान है कि मुझे बिना उपयोग के एक चर का उपयोग करना है। यह अनावश्यक मस्तिष्क भार और मेरी आईडीई में एक चेतावनी भी बनाता है। मैंने उपयोग करने की कोशिश की _ -> true, लेकिन यह एक वाक्यविन्यास त्रुटि है। जावा निश्चित रूप से "अप्रयुक्त पैरामीटर" के लिए एक कीवर्ड (रीड: कीलर) को याद कर रहा है। आशा है कि ऐसा कुछ जावा 9 (या कम से कम: जावा में जो भी मेरे मरने से पहले आएगा ^ ^)
kap

4

बिना अमरूद के

Boolean.TRUE::booleanValue

3
यह तो दिलचस्प है। मुझे यकीन नहीं है कि यह पूरी तरह से अनुरोध की भावना को पकड़ लेता है, लेकिन इसे रचनात्मकता के लिए अंक मिलते हैं!
गैरेट विल्सन

21
लेकिन यह एक नहीं है Predicate, क्योंकि यह एक तर्क नहीं लेता है।
फ्लोरेंट

1
यह एक विधेय नहीं है, यह एक विधि संदर्भ है लेकिन इसमें संक्षिप्त होने का गुण है और अप्रयुक्त पैरामीटर का उल्लेख करने के लिए मजबूर नहीं है। +1 वैसे, जैसे कि यह अमरूद का उपयोग करने से बचता है, जिसमें प्रतिरूपकता की एक गंभीर समस्या है, यह मेरे
उत्थान के

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