एरो ऑपरेटर, '->', जावा में क्या करता है?


170

कुछ कोड के माध्यम से शिकार करते समय मैं तीर ऑपरेटर के पास आया, यह वास्तव में क्या करता है? मुझे लगा कि जावा में एक तीर ऑपरेटर नहीं है।

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
        return Car.SEDAN == ((Car)arg0).getStyle();
});

विवरण : Java 6, Apache Commons Collection, IntelliJ 12

अद्यतन / उत्तर: यह पता चलता है कि इंटेलीज 12 जावा 8 का समर्थन करता है, जो लैम्ब्डा का समर्थन करता है, और लैम्बदास के रूप में "फोल्डिंग" को भविष्यवाणी और प्रदर्शित करता है। नीचे "अन-फोल्ड" कोड है।

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});

5
ध्यान दें कि सटीक परिदृश्य इंटेलीज है जो मौजूदा कोड को लंबोदर अभिव्यक्ति के रूप में प्रस्तुत कर रहा है ताकि इसे पढ़ना आसान हो सके। वास्तविक कोड एक लैम्ब्डा अभिव्यक्ति नहीं है।
थोरबजोरन राव एंडरसन

जवाबों:


125

यह नए लैम्ब्डा एक्सप्रेशंस के सिंटैक्स का हिस्सा है, जिसे जावा 8 में पेश किया जाना है। इसके हैंग होने के लिए ऑनलाइन ट्यूटोरियल्स की एक जोड़ी है, यहाँ एक लिंक दिया गया है। मूल रूप ->से, कार्यान्वयन (दाईं ओर) से मापदंडों (बाएं-पक्ष) को अलग करता है।

लैम्ब्डा अभिव्यक्ति का उपयोग करने के लिए सामान्य वाक्यविन्यास है

(पैरामीटर) -> {शरीर} जहां '->' मापदंडों और लैम्ब्डा अभिव्यक्ति शरीर को अलग करता है।

पैरामीटर कोष्ठकों में संलग्न हैं जो कि तरीकों के लिए उसी तरह है और लैम्ब्डा अभिव्यक्ति शरीर ब्रेसिज़ में संलग्न कोड का एक ब्लॉक है।


10
ओपी जेडडीके 6 का उपयोग कर रहा है, इसलिए यह वास्तव में सिर्फ इंटेलीज फोल्डिंग कोड है जैसा कि @antonm के अनुसार नीचे दिया गया है
सीन

6
@ सीनलैंड्समैन ओपी जावा 6 का उपयोग कर सकता है, लेकिन सवाल में वह कहता है कि वह उस कोड में कहीं और आया था। क्यों इंटेलीजे एक त्रुटि, एक रहस्य है कि रिपोर्ट नहीं कर रही करने के लिए के रूप में (शायद वहाँ है एक जावा 7 संस्करण ओपी के सिस्टम में कहीं स्थापित)। लेकिन यह जावा में एक लैम्ब्डा एक्सप्रेशन का सिंटैक्स है, इसके बारे में कोई सवाल नहीं है।
सकर लोपेज

37

यह तब उपयोगी है जब आप एक कार्यात्मक इंटरफ़ेस लागू करना चाहते हैं

Runnable r = ()-> System.out.print("Run method");

के बराबर है

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };

यह सुविधा क्यों प्रदान की गई है?
20 अगस्त को akaisteph7

1
@ Akaisteph7 जब आप एक विधि को परिभाषित नहीं करना चाहते हैं क्योंकि आप पाते हैं कि केवल एक कॉलर कभी भी उस पद्धति को कॉल करने जा रहा है। उन मामलों में यह समझ में नहीं आता है कि विधि के शरीर में एक अलग स्थान पर विधि को परिभाषित न करें, नंबा के बाद अनाम विधि के बारे में पढ़ें।
विवेक शुक्ला

30

मेरा मानना ​​है, यह तीर आपकी आईडीई के कारण मौजूद है। IntelliJ IDEA कुछ कोड के साथ ऐसी बात करता है। इसे कोड फोल्डिंग कहा जाता है। आप इसे विस्तारित करने के लिए तीर पर क्लिक कर सकते हैं।


36
@DavidConrad नहीं, यह गलत नहीं है। इंटेलीज वास्तव में लंबोदर की तरह दिखने के लिए कार्यात्मक इंटरफेस के इनलाइन कार्यान्वयन को गुना करता है।
बाल्फा

12
प्रश्न देखें: "विवरण: जावा 6, अपाचे कॉमन्स कलेक्शन, इंटेलीज 12" लावाडा इन जावा 6 ???
एंटोन-एम

13

यह एक लंबोदर अभिव्यक्ति है।

इसका मतलब है कि, listOfCars से, arg0 उस सूची के आइटमों में से एक है। उस आइटम के साथ वह करने जा रहा है, इसलिए ->, जो कुछ भी कोष्ठक के अंदर है।

इस उदाहरण में, वह उन कारों की एक सूची वापस करने जा रहा है जो स्थिति के अनुकूल हैं

Car.SEDAN == ((Car)arg0).getStyle();

2

लैम्ब्डा अभिव्यक्ति के लिए नया ऑपरेटर जावा 8 में जोड़ा गया

लैम्ब्डा अभिव्यक्ति विधि लेखन का संक्षिप्त तरीका है।
यह परोक्ष रूप से कार्यात्मक इंटरफ़ेस को लागू करने के लिए उपयोग किया जाता है

प्राथमिक सिंटैक्स: (पैरामीटर) -> {कथन; }

प्रभावी लंबोदर अभिव्यक्ति के लिए कुछ बुनियादी नियम हैं जो आपको चाहिए।

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