2016-11-07 4 views
9

स्विफ्ट में, फ़ंक्शन प्रकारों को प्रथम श्रेणी के नागरिक के रूप में माना जाता है, और किसी अन्य प्रकार के रूप में कहीं भी उपयोग किया जा सकता है। इसका वाक्यविन्यास सरल है, और आसानी से समझ और उपयोग किया जा सकता है।स्विफ्ट के फ़ंक्शन प्रकार के साथ जावा की लैम्ब्डा अभिव्यक्ति की तुलना

दूसरी ओर, जावा लैम्ब्डा अभिव्यक्तियों के माध्यम से फ़ंक्शन प्रोग्रामिंग का समर्थन करता है, लेकिन सामान्य रूप से, मुझे स्विफ्ट के फ़ंक्शन प्रकार की तुलना में इसे कम सहज, समझने में कठिनाई होती है, और प्रतीत होता है और अधिक प्रतिबंधित है।

मेरा प्रश्न है, क्योंकि स्विफ्ट के फ़ंक्शन प्रकार और जावा की लैम्ब्डा अभिव्यक्ति का उद्देश्य कार्यात्मक प्रोग्रामिंग प्राप्त करना है, क्या स्विफ्ट का फ़ंक्शन प्रकार कुछ भी कर सकता है, लेकिन जावा की लैम्ब्डा अभिव्यक्ति नहीं कर सकती है? या वे दोनों समान रूप से शक्तिशाली हैं?

+1

तुलना में [कोटलिन] (https://kotlinlang.org/) जोड़ने पर विचार करें। – Vadzim

+1

कुछ ऐसा माना जाना चाहिए जो जावा में प्रदर्शन/ब्लोट हिट है: https://realm.io/news/360andev-jake-wharton-java-hidden-costs-android/ मूल रूप से, बंद करने और फ़ंक्शन प्रकारों के स्विफ्ट के कार्यान्वयन भाग हैं भाषा के मूल के। जावा के कार्यान्वयन पर कार्रवाई की जाती है। – PeejWeej

उत्तर

8

जावा के lambdas (कार्यान्वयन) और स्विफ्ट के functional type (प्रकार) की तुलना करना गलत है। लेकिन जावा के लैम्ब्डा को स्विफ्ट्स Closures से तुलना करना संभव है। और स्विफ्ट का कार्यात्मक प्रकार जावा के functional interfaces पर।

क्लोजर lambdas तुलना में अधिक शक्तिशाली हैं:

  1. (प्रमुख) बंद किया जाना, गैर लगातार चर पर कब्जा कर सकते हैं ई। जी

    func makeIncrementer(forIncrement amount: Int) ->() -> Int { 
        var runningTotal = 0 
        return() -> Int { 
         runningTotal += amount 
         return runningTotal 
        } 
    } 
    
  2. (मामूली) क्लोजर आशुलिपि तर्क के नाम, उदाहरण के लिए समर्थन

    reversedNames = names.sorted(by: { $0 > $1 }) 
    
  3. (मामूली) पीछे हटने का समर्थन समर्थन, उदा।

    someFunctionThatTakesAClosure() { 
        // trailing closure's body goes here 
    } 
    

दूसरी ओर से, कार्यात्मक इंटरफेस कार्यात्मक प्रकार की तुलना में अधिक शक्तिशाली हैं। वे अतिरिक्त विधियों की घोषणा करने की अनुमति देते हैं, उदा। java.util.Comparator जो तुलनित्र भवन के लिए सुविधाजनक तरीकों का एक गुच्छा परिभाषित करता है, जैसे कि reversed और thenComparing

+0

यह शायद एक हैक है, लेकिन आप अपने मामले # 1, यानी 'अंतिम int [] runningValue = new int [] {0};' और फिर '() -> {वापसी ++ की तरह कार्य करने के लिए जावा में एक सरणी का उपयोग कर सकते हैं। runningValue [0]; } '। –

2

मैं केवल जावा कार्यात्मक एपीआई में एक प्रतिबंध के बारे में सोच सकता हूं।

जावा में लैम्ब्डा अभिव्यक्ति लिखने के लिए, आपको एक विधि के साथ एक इंटरफेस की आवश्यकता होगी। जेडीके में आपके लिए पहले से ही कुछ इंटरफेस बनाए गए हैं, लेकिन आईएमएचओ, उनके नाम स्विफ्ट के फ़ंक्शन प्रकारों की तुलना में कम वर्णनात्मक हैं। आप तुरंत अनुमान नहीं लगा सकते कि Predicate<T>T पैरामीटर स्वीकार करता है और boolean देता है। दूसरी ओर, T -> Bool बहुत साफ और स्पष्ट है।

मुझे लगता है कि इसके अलावा, जावा के लैम्ब्डा एक्सप्रेशन कुछ भी कर सकते हैं जो त्वरित कार्य प्रकार कर सकते हैं।

0

मुझे लगता है कि, किसी भी मामले में, मुझे जावा डेवलपर के रूप में दोनों का अध्ययन करना है, यह कह सकता है कि कार्यात्मक प्रोग्रामिंग इसे समझने के लिए एक कठिन विषय है, लेकिन अब मैं बहुत सारी सुविधाओं को समझता हूं, मुझे नहीं पता कि आप क्या कर सकते हैं क्लोजर का उपयोग करते समय SWIFT में स्ट्रीम का उपयोग करें, एक बार जब आप कार्यात्मक इंटरफेस प्राप्त करते हैं और लैम्बडा को कैसे कार्यान्वित करते हैं, तो आपको पता चलेगा कि आप लैम्ब्डा/स्ट्रीम संयोजन के साथ एक और अधिक पठनीय तरीके से कोड की कुछ पंक्तियों के साथ बहुत सी चीजें बना सकते हैं, मुझे लगता है ऑरैकल ने उस पर बहुत मेहनत की थी, और यदि आप अच्छी तरह से उपयोग करते हैं तो आप अपने प्रश्न का उत्तर देने के लिए क्लीनर और बेहतर कोड बना सकते हैं, दोनों शक्तिशाली हैं, लेकिन मैं मानता हूं कि लैम्ब्डा तेजी से तेजी से बंद हो जाते हैं।

संबंधित मुद्दे