Interfejs funkcjonalny Java 8 bez argumentów i wartości zwracanej


110

Co to jest funkcjonalny interfejs Java 8 dla metody, która nic nie pobiera i nic nie zwraca?

To znaczy odpowiednik C # bez parametrów Actionz voidtypem zwracanym?

Odpowiedzi:


98

Jeśli dobrze rozumiem, potrzebujesz funkcjonalnego interfejsu z metodą void m(). W takim przypadku możesz po prostu użyć pliku Runnable.


29
Runnablespecyfikacja interfejsu wskazuje, że ma on udostępniać Threadklasie wykonywalny kod . Nie wydaje mi się właściwe używanie Runnablego tam, gdzie nie jest przeznaczone do wykonania przez wątek; wydaje się mylące. Runnablejest zdefiniowany jako a, FunctionalInterfaceponieważ spełnia specyfikację funkcjonalnego interfejsu i może być utworzony przy użyciu składni lambda. Dlaczego nie stworzyć własnego funkcjonalnego interfejsu? zobacz Runnable , zobacz FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnablejest opatrzony adnotacją @FunctionalInterfacei (ii) nawet w kontekście wyrażenia lambda zostanie wykonany na wątku: wątku, w którym jest uruchamiana lambda, który może być bieżącym wątkiem ...
assylias

9
Zgadzam się z @TheSecretSquad, chociaż spełnia on wymagania funkcjonalne, nie brzmi zbyt semantycznie, Runnable jest powszechnie kojarzony z tworzeniem wątków. Prosty interfejs funkcjonalny Worker z metodą doWork byłby miły. EDYCJA: Ups: stackoverflow.com/questions/27973294/…
jpangamarca

6
Wykreślanie „Ups” @jpangamarca powyżej: W komentarzach do pytania, które podał, Brian Goetz potwierdził, że Runnablema ono służyć do tego celu, a nie tylko do wątków.
Joshua Goldberg

10
Biorąc jednak pod uwagę, że tak jest, myślę, że javadoc powinien być bardziej ogólny: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg

15

Po prostu stwórz własne

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

i używaj go w ten sposób

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

}

i wyjście

HelloWorld
WorldHello

Naprawdę czuję, biorąc pod uwagę etos pytania, że ​​powinna to być zaakceptowana odpowiedź.
corsiKa

0

@FunctionalInterface zezwala tylko na metodę abstrakcyjną metody Stąd możesz utworzyć instancję tego interfejsu z wyrażeniem lambda jak poniżej i możesz uzyskać dostęp do elementów interfejsu

        @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:::
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.