Java 8功能接口,无参数,无返回值


Answers:


97

如果我正确理解的话,你想要一个具有方法的功能接口void m()。在这种情况下,您只需使用即可Runnable


29
Runnable的接口规范表明它将为Thread该类提供可执行代码。在我看来,Runnable在不打算由线程执行的地方使用它是不合适的。似乎具有误导性。Runnable定义为,FunctionalInterface因为它符合功能接口的规范,并且可以使用lambda语法创建。为什么不创建自己的功能界面?参见Runnable,参见FunctionalInterface
TheSecretSquad 2015年

6
@TheSecretSquad(i)Runnable带有@FunctionalInterface(ii)注释,即使在lambda表达式的上下文中,它也将在线程上执行:运行lambda的线程可能是当前线程...
assylias

9
我同意@TheSecretSquad,虽然它满足功能要求,但听起来不是很语义,Runnable通常与创建线程相关联。一个带有doWork方法的简单Worker功能接口将是不错的选择。编辑:哎呀:stackoverflow.com/questions/27973294/...
jpangamarca

6
在上方充实@jpangamarca的“糟糕”:在他所链接的重复问题的评论中,Brian Goetz证实了Runnable其目的是用于此目的,而不仅仅是用于线程上下文。
约书亚·戈德堡

10
不过,考虑到这种情况,我认为应该使javadoc更加通用:docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg,

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仅允许方法抽象方法,因此您可以使用以下lambda表达式实例化该接口,并且可以访问该接口成员

        @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:::
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.