Функціональний інтерфейс Java 8 без аргументів і без зворотного значення


109

Що таке функціональний інтерфейс Java 8 для методу, який нічого не бере і нічого не повертає?

Тобто, що еквівалентно параметру C # Actionбез voidтипу повернення?

Відповіді:


96

Якщо я правильно розумію, вам потрібен функціональний інтерфейс із методом void m(). У такому випадку ви можете просто використовувати Runnable.


29
RunnableСпецифікація інтерфейсу вказує, що це забезпечити виконуваному коду Threadкласу. Мені не здається правильним використовувати те, Runnableде він не призначений для виконання потоком; здається оманливим. Runnableвизначається як a, FunctionalInterfaceоскільки він відповідає специфікації функціонального інтерфейсу і може бути створений за допомогою лямбда-синтаксису. Чому б не створити власний функціональний інтерфейс? дивіться Runnable , див. FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) зазначається за Runnableдопомогою @FunctionalInterfaceі (ii) навіть у контексті лямбда-виразу він буде виконуватися на потоці: нитка, в яку запускається лямбда, може бути поточною ниткою ...
assylias

9
Я погоджуюся з @TheSecretSquad, хоча він задовольняє функціональну вимогу, але це не дуже смислово звучить, Runnable зазвичай асоціюється зі створенням ниток. Простий функціональний інтерфейс Worker з методом doWork був би непоганим. EDIT: До жаль: stackoverflow.com/questions/27973294 / ...
jpangamarca

6
Розгортання "Ой" зверху: "У коментарях до дублюючого питання, яке він пов’язував, Брайан Гец підтвердив, що 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.