Interfaccia funzionale Java 8 senza argomenti e senza valore di ritorno


110

Qual è l'interfaccia funzionale Java 8 per un metodo che non richiede nulla e non restituisce nulla?

Vale a dire, l'equivalente di C # senza parametri Actioncon voidtipo restituito?

Risposte:


97

Se ho capito bene vuoi un'interfaccia funzionale con un metodo void m(). In tal caso puoi semplicemente usare un file Runnable.


29
RunnableLa specifica dell'interfaccia di indica che deve fornire codice eseguibile alla Threadclasse. Non mi sembra giusto usare Runnabledove non è inteso per l'esecuzione da parte di un thread; sembra fuorviante. Runnableè definito come un FunctionalInterfaceperché soddisfa le specifiche di un'interfaccia funzionale e può essere creato utilizzando la sintassi lambda. Perché non creare la tua interfaccia funzionale? vedi Runnable , vedi FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnableè annotato con @FunctionalInterfacee (ii) anche nel contesto di un'espressione lambda verrà eseguito su un thread: il thread in cui viene eseguito lambda che potrebbe essere il thread corrente ...
assylias

9
Sono d'accordo con @TheSecretSquad, sebbene soddisfi i requisiti funzionali, non suona molto semantico, Runnable è comunemente associato alla creazione di thread. Una semplice interfaccia funzionale di Worker con un metodo doWork sarebbe stata carina. EDIT: Oops: stackoverflow.com/questions/27973294/...
jpangamarca

6
Rifinendo "Oops" di @ jpangamarca sopra: nei commenti alla domanda duplicata che ha collegato, Brian Goetz ha confermato che Runnableera destinato a essere utilizzato per questo scopo, non solo per i contesti di threading.
Joshua Goldberg

10
Dato che è così, però, penso che il javadoc dovrebbe essere reso più generico: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg

15

Creane uno tuo

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

e usalo in questo modo

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

}

e l'uscita

HelloWorld
WorldHello

Sento davvero, data l'etica della domanda, che questa dovrebbe essere la risposta accettata.
corsiKa

0

@FunctionalInterface consente solo il metodo astratto Quindi puoi istanziare quell'interfaccia con l'espressione lambda come sotto e puoi accedere ai membri dell'interfaccia

        @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:::
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.