जावा 8 कार्यात्मक इंटरफ़ेस जिसमें कोई तर्क नहीं है और कोई वापसी मूल्य नहीं है


110

जावा 8 फंक्शनल इंटरफेस एक ऐसी विधि के लिए है जो कुछ भी नहीं लेता है और कुछ भी नहीं देता है?

यानी, रिटर्न प्रकार के Actionसाथ C # पैरामीटर के बराबर void?

जवाबों:


97

अगर मैं सही ढंग से समझूं तो आप एक विधि के साथ एक कार्यात्मक इंटरफ़ेस चाहते हैं void m()। जिस स्थिति में आप बस एक का उपयोग कर सकते हैं Runnable


29
Runnableयह इंटरफ़ेस विनिर्देश इंगित करता है कि यह Threadकक्षा के लिए निष्पादन योग्य कोड प्रदान करना है । यह मेरे लिए सही नहीं लगता है कि Runnableजहां यह एक थ्रेड द्वारा निष्पादन के लिए इरादा नहीं है; भ्रामक लगता है। Runnableएक के रूप में परिभाषित किया गया है FunctionalInterface, क्योंकि यह एक कार्यात्मक इंटरफ़ेस के विनिर्देश को पूरा करती है और लैम्ब्डा वाक्य रचना का उपयोग कर बनाया जा सकता है। अपना स्वयं का कार्यात्मक इंटरफ़ेस क्यों नहीं बनाएं? देख Runnable , देख FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnableके साथ टिप्पणी की जाती है @FunctionalInterfaceऔर (ii) यहां तक कि एक लैम्ब्डा अभिव्यक्ति यह एक धागे पर निष्पादित किया जाएगा के संदर्भ में: धागा, जिसमें लैम्ब्डा चलाया जाता है जो वर्तमान धागा हो सकता है ...
assylias

9
मैं @TheSecretSquad से सहमत हूं, जबकि यह कार्यात्मक आवश्यकता को संतुष्ट करता है, यह बहुत अर्थपूर्ण नहीं लगता है, रननेबल आमतौर पर थ्रेड बनाने के साथ जुड़ा हुआ है। एक साधारण कार्यकर्ता के साथ एक doWork विधि का इंटरफ़ेस अच्छा होता। संपादित करें: ऊप्स: stackoverflow.com/questions/27973294/…
jpangamarca

6
Fleshing @ jpangamarca के "उफ़" के ऊपर: डुप्लिकेट प्रश्न पर टिप्पणी में वह जुड़ा हुआ है, ब्रायन गोएत्ज़ ने पुष्टि की कि Runnableइस उद्देश्य के लिए इस्तेमाल किया जाना था, न कि केवल संदर्भों को फैलाने के लिए।
जोशुआ गोल्डबर्ग

10
यह देखते हुए कि मामला है, हालांकि, मुझे लगता है कि javadoc को अधिक सामान्य बनाया जाना चाहिए: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
जोशुआ गोल्डबर्ग

15

बस अपना बना लो

@FunctionalInterface
public interface Procedure {
    void run();

    default Procedure andThen(Procedure after){
        return () -> {
            this.run();
            after.run();
        };
    }

    default Procedure compose(Procedure before){
        return () -> {
            before.run();
            this.run();
        };
    }
}

और इसे इस तरह से उपयोग करें

public static void main(String[] args){
    Procedure procedure1 = () -> System.out.print("Hello");
    Procedure procedure2 = () -> System.out.print("World");

    procedure1.andThen(procedure2).run();
    System.out.println();
    procedure1.compose(procedure2).run();

}

और आउटपुट

HelloWorld
WorldHello

मुझे वास्तव में लगता है, इस सवाल का लोकाचार दिया गया है कि यह स्वीकृत उत्तर होना चाहिए।
corsiKa

0

@FunctionalInterface केवल विधि अमूर्त विधि की अनुमति देता है इसलिए आप उस इंटरफ़ेस को नीचे दिए गए लंबोदर एक्सप्रेशन के रूप में देख सकते हैं और आप इंटरफ़ेस सदस्यों तक पहुँच सकते हैं

        @FunctionalInterface
        interface Hai {

            void m2();

            static void m1() {
                System.out.println("i m1 method:::");
            }

            default void log(String str) {
                System.out.println("i am log method:::" + str);
            }

        }

    public class Hello {
        public static void main(String[] args) {

            Hai hai = () -> {};
            hai.log("lets do it.");
            Hai.m1();

        }
    }


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