假设我在Java 8中有以下功能接口:
interface Action<T, U> {
U execute(T t);
}
在某些情况下,我需要一个没有参数或返回类型的操作。所以我写
就像这样:
Action<Void, Void> a = () -> { System.out.println("Do nothing!"); };
但是,它给了我编译错误,我需要把它写成
Action<Void, Void> a = (Void v) -> { System.out.println("Do nothing!"); return null;};
这很难看。是否有办法摆脱Void类型参数?
这是不可能的。具有非Void返回类型的函数(即使它是Void)必须返回一个值。然而,你可以添加静态方法的动作,让你“创建”一个动作:
interface Action<T, U> {
U execute(T t);
public static Action<Void, Void> create(Runnable r) {
return (t) -> {r.run(); return null;};
}
public static <T, U> Action<T, U> create(Action<T, U> action) {
return action;
}
}
这将允许您编写以下内容:
// create action from Runnable
Action.create(()-> System.out.println("Hello World")).execute(null);
// create normal action
System.out.println(Action.create((Integer i) -> "number: " + i).execute(100));
我认为这是不可能的,因为函数定义在您的示例中不匹配。
lambda表达式的计算结果完全为
void action() { }
而你的声明看起来像
Void action(Void v) {
//must return Void type.
}
例如,如果您有以下接口
public interface VoidInterface {
public Void action(Void v);
}
(在实例化时)唯一一种兼容的函数是这样的
new VoidInterface() {
public Void action(Void v) {
//do something
return v;
}
}
缺少return语句或参数都会导致编译器错误。
因此,如果你声明一个函数接受一个参数并返回一个,我认为不可能将它转换为上面提到的任何一个函数。