Java 8功能接口,没有参数,也没有返回值

Mig*_*boa 99 java java-8 java-stream

什么是一个方法的Java 8功能接口什么都不带,什么都不返回?

即,相当于Actionvoid返回类型的C#参数?

ass*_*ias 88

如果我理解正确,你想要一个方法的功能接口void m().在这种情况下,您可以简单地使用Runnable.

  • `Runnable`的接口规范表明它是为`Thread`类提供可执行代码.对于我来说,使用`Runnable`似乎不对,它不是由线程执行的; 似乎有误导性.`Runnable`被定义为`FunctionalInterface`,因为它符合功能接口的规范,可以使用lambda语法创建.为什么不创建自己的功能界面?参见[Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html),参见[FunctionalInterface](http://docs.oracle.com/javase/8 /docs/api/java/lang/FunctionalInterface.html) (28认同)
  • 我同意@TheSecretSquad,虽然它满足功能要求,但听起来不是很语义,Runnable通常与创建线程有关.使用doWork方法的简单Worker功能界面本来不错.编辑:哎呀:http://stackoverflow.com/questions/27973294/function-with-no-args-and-no-return-type-void-in-java-8?lq=1#comment44339647_27973294 (8认同)
  • 鉴于情况确实如此,我认为javadoc应该更通用:https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html (8认同)
  • @TheSecretSquad(i)`Runnable`用`@ FunctionalInterface`注释,并且(ii)即使在lambda表达式的上下文中,它也将在一个线程上执行:运行lambda的线程可能是当前线程. .. (6认同)
  • 充实@ jpangamarca上面的"哎呀":在他关联的重复问题的评论中,Brian Goetz确认"Runnable"旨在用于此目的,而不仅仅是用于线程上下文. (6认同)
  • 从 Java 19 开始,它实际上是“官方”方式:请参阅 https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Runnable.html 与 Java 18 的 https ://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/lang/Runnable.html (5认同)
  • 是的,我在新的`java.util.function`包中寻找它,我完全忘记了旧的`Runnable` (3认同)
  • FWIW Java 11 标准库至少在一个地方使用 `Runnable` 来实现此目的:[`Optional::ifPresentOrElse`](https://docs.oracle.com/en/java/javase/11/docs/api/ java.base/java/util/Optional.html#ifPresentOrElse(java.util.function.Consumer,java.lang.Runnable)) (这无疑也让我首先想到它是否会在不同的线程上运行) (3认同)

Cha*_*ana 12

自己动手

@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();
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用

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

}
Run Code Online (Sandbox Code Playgroud)

和输出

HelloWorld
WorldHello
Run Code Online (Sandbox Code Playgroud)