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

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

137
Miguel Gamboa 26 Май 2014 в 15:08

3 ответа

Лучший ответ

Если я правильно понял, вам нужен функциональный интерфейс с методом void m(). В этом случае вы можете просто использовать Runnable.

125
Roland 16 Авг 2016 в 10:58
46
Спецификация интерфейса Runnable указывает, что он должен предоставить исполняемый код классу Thread. Мне кажется неправильным использовать Runnable там, где он не предназначен для выполнения потоком; кажется вводящим в заблуждение. Runnable определяется как FunctionalInterface, потому что он соответствует спецификации функционального интерфейса и может быть создан с использованием синтаксиса лямбда. Почему бы не создать свой собственный функциональный интерфейс? см. Runnable, см. FunctionalInterface
 – 
TheSecretSquad
1 Май 2015 в 07:02
9
(i) Runnable аннотируется @FunctionalInterface и (ii) даже в контексте лямбда-выражения он будет выполняться в потоке: поток, в котором выполняется лямбда, который может быть текущим потоком ...
 – 
assylias
1 Май 2015 в 11:36
12
Я согласен с @TheSecretSquad, хотя он удовлетворяет функциональным требованиям, он не звучит очень семантично, Runnable обычно ассоциируется с созданием потоков. Было бы неплохо иметь простой функциональный интерфейс Worker с методом doWork. РЕДАКТИРОВАТЬ: Ой: stackoverflow.com/questions/27973294/…
 – 
jpangamarca
19 Авг 2015 в 18:46
9
Конкретизируя "Упс" @ jpangamarca выше: В комментариях к дублирующемуся вопросу, на который он указал, Брайан Гетц подтвердил, что Runnable предназначен для использования для этой цели, а не только для контекстов многопоточности.
 – 
Joshua Goldberg
1 Апр 2016 в 00:26
12
Однако, учитывая это, я думаю, что javadoc следует сделать более общим: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
 – 
Joshua Goldberg
1 Апр 2016 в 00:29

Просто сделай свой собственный

@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
35
Charana 31 Июл 2017 в 18:07
2
Я действительно чувствую, учитывая дух вопроса, что это должен быть принятый ответ.
 – 
corsiKa
28 Мар 2019 в 08:32

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

Выход:

i am log method:::lets do it.
i m1 method:::
0
Vladislav Varslavans 13 Янв 2021 в 12:08