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

110

Каков функциональный интерфейс Java 8 для метода, который ничего не берет и ничего не возвращает?

То есть, эквивалент C # без параметров Actionс voidвозвращаемым типом?

Мигель Гамбоа
источник

Ответы:

98

Если я правильно понимаю, вам нужен функциональный интерфейс с методом 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. РЕДАКТИРОВАТЬ: Ой: stackoverflow.com/questions/27973294/…
jpangamarca
6
Конкретизируя "Упс" @ 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:::
Ума Махеш
источник