【发布时间】:2014-05-26 11:08:51
【问题描述】:
Java 8 函数式接口对于什么都不接受也不返回什么的方法是什么?
即,相当于 C# 无参数 Action 与 void 返回类型?
【问题讨论】:
标签: java java-8 java-stream
Java 8 函数式接口对于什么都不接受也不返回什么的方法是什么?
即,相当于 C# 无参数 Action 与 void 返回类型?
【问题讨论】:
标签: java java-8 java-stream
如果我理解正确,您需要一个带有 void m() 方法的功能接口。在这种情况下,您可以简单地使用Runnable。
【讨论】:
Runnable 的接口规范表明它将为Thread 类提供可执行代码。在我不打算由线程执行的情况下使用Runnable 似乎不合适;似乎具有误导性。 Runnable 被定义为FunctionalInterface,因为它符合功能接口的规范,并且可以使用 lambda 语法创建。为什么不创建自己的功能界面?见Runnable,见FunctionalInterface
Runnable 被注释为@FunctionalInterface 并且 (ii) 即使在 lambda 表达式的上下文中,它也会在线程上执行:运行 lambda 的线程这可能是当前线程...
Runnable 旨在用于此目的,而不仅仅是用于线程上下文。
自己做
@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
【讨论】:
@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();
}
}
输出:
i am log method:::lets do it.
i m1 method:::
【讨论】: