Java 8 lambda Void 参数

2022-08-31 05:14:45

假设我在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


答案 1

如果供应商不需要任何东西,但返回了某些东西,请使用供应商。

如果它需要某些东西,但什么也不返回,请使用 Consumer

如果它返回结果并可能抛出(在一般 CS 术语中,最类似于 Thunk),请使用 Callable)。

如果 Runnable 既不执行也不能投掷,请使用 Runnable。


答案 2

我认为这个表简短而有用:

Supplier       ()    -> x
Consumer       x     -> ()
BiConsumer     x, y  -> ()
Callable       ()    -> x throws ex
Runnable       ()    -> ()
Function       x     -> y
BiFunction     x,y   -> z
Predicate      x     -> boolean
UnaryOperator  x1    -> x2
BinaryOperator x1,x2 -> x3

正如其他答案所说,这个问题的适当选择是Runnable