Bağımsız değişken ve dönüş değeri olmayan Java 8 işlevsel arabirimi


110

Hiçbir şey almayan ve hiçbir şey döndürmeyen bir yöntem için Java 8 işlevsel arabirimi nedir?

Yani, C # parametresiz için eşdeğer Actionolan voiddönüş türü?

Yanıtlar:


98

Doğru anladıysam, bir yöntemle işlevsel bir arayüz istiyorsunuz void m(). Bu durumda, basitçe bir Runnable.


29
Runnablearayüzünün belirtimi, Threadsınıfa çalıştırılabilir kod sağlamak olduğunu belirtir . RunnableBir iş parçacığı tarafından yürütülmesi amaçlanmayan yerlerde kullanmak bana doğru görünmüyor ; yanıltıcı görünüyor. Runnableolarak tanımlanır FunctionalInterfaceçünkü işlevsel bir arayüzün özelliklerini karşılar ve lambda sözdizimi kullanılarak oluşturulabilir. Neden kendi işlevsel arayüzünüzü oluşturmuyorsunuz? bkz. Runnable , bkz. FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnableile açıklanmıştır @FunctionalInterfaceve (ii) bir lambda ifadesi bağlamında bile, bir evre üzerinde çalıştırılacaktır:
lambda'nın

9
@TheSecretSquad'e katılıyorum, işlevsel gereksinimi karşılamasına rağmen kulağa pek anlamsal gelmiyor, Runnable genellikle iş parçacığı oluşturmakla ilişkilendiriliyor. DoWork yöntemi ile basit bir Worker işlevsel arayüzü güzel olurdu. DÜZENLEME: Hata: stackoverflow.com/questions/27973294/…
jpangamarca

6
@ Jpangamarca'nın "Oops" u yukarıda: Bağlantı kurduğu yinelenen soruyla ilgili yorumlarda, Brian Goetz bunun Runnableyalnızca bağlamları dizmek için değil, bu amaçla kullanılması amaçlandığını doğruladı .
Joshua Goldberg

10
Durum bu olsa da, javadoc'un
Joshua Goldberg

15

Sadece kendin yap

@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();
        };
    }
}

ve böyle kullan

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();

}

ve çıktı

HelloWorld
WorldHello

Sorunun ahlakı göz önüne alındığında, bunun kabul edilen cevap olması gerektiğini gerçekten hissediyorum.
corsiKa

0

@FunctionalInterface yalnızca yöntem soyut yöntemine izin verir.Bu nedenle, aşağıdaki gibi lambda ifadesi ile bu arabirimi başlatabilir ve arabirim üyelerine erişebilirsiniz.

        @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:::
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.