假设我在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类型参数?
我认为这是不可能的,因为函数定义在您的示例中不匹配。
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语句或参数都会导致编译器错误。
因此,如果你声明一个函数接受一个参数并返回一个,我认为不可能将它转换为上面提到的任何一个函数。
我认为这是不可能的,因为函数定义在您的示例中不匹配。
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语句或参数都会导致编译器错误。
因此,如果你声明一个函数接受一个参数并返回一个,我认为不可能将它转换为上面提到的任何一个函数。
与@rado回答参数和描述相同的方法:
/*----------------------
Represents an operation
that accepts two input
arguments and returns no
result.
*/
BiConsumer<T,U> (T x, U y) -> ()
/*----------------------
Represents a function
that accepts two arguments
and produces a result.
*/
BiFunction<T,U,R> (T x, U y) -> R z
/*----------------------
Represents an operation
upon two operands of the
same type, producing a
result of the same type
as the operands.
*/
BinaryOperator<T> (T x1, T x2) -> T x3
/*----------------------
A task that returns a
result and may throw an
exception.
*/
Callable<V> () -> V x throws ex
/*----------------------
Represents an operation
that accepts a single
input argument and returns
no result.
*/
Consumer<T> (T x) -> ()
/*----------------------
Represents a function that
accepts one argument and
produces a result.
*/
Function<T,R> (T x) -> R y
/*----------------------
Represents a predicate
(boolean-valued function)
of one argument.
*/
Predicate<T> (T x) -> boolean
/*----------------------
Represents a portion of
executable code that
don't recieve parameters
and returns no result.
*/
Runnable () -> ()
/*----------------------
Represents a supplier of
results.
*/
Supplier<T> () -> T x
/*----------------------
Represents an operation
on a single operand that
produces a result of the
same type as its operand.
*/
UnaryOperator<T> (T x1) -> T x2
字体:
[1] https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
[2] https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
[3] https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html