Dmi*_*try 6 java lambda variadic-functions
我试图在varag中统一lambdas和简单的值.
public static void Log(String format, Object ... args) {
final Object[] fmt = new Object[ args.length ];
for(int i = 0; i < args.length; i++)
fmt[i] = args[i] instanceof Supplier ?
( (Supplier) args[i] ).get() :
args[i];
final String s = String.format( format, fmt );
System.err.println( s );
}
final Supplier
s = () -> "aaa",
d = () -> 111;
Log( "%s %d %s %d", "bbb", 222, s, d ); // OK, OUTPUT: bbb 222 aaa 111
Log( "%s %d %s %d", "bbb", 222, () -> "aaa", () -> 111 ); // COMPILE FAIL
Run Code Online (Sandbox Code Playgroud)
错误:方法Log不能应用于给定类型; REQUIERED String,Object [] found:String,String,int,() - >"aaa",() - > 111 REASON:varargs不匹配; 对象不是功能接口
是否可以将lambdas和值传递给vararg?
问题出在错误消息中
对象不是功能接口
您只能为功能接口创建一个lambda(一个只有一个抽象方法)对象不是接口,它没有任何抽象方法,因此您无法创建此类型的lambda.你能做的是
Log( "%s %d %s %d", "bbb", 222, (Supplier) () -> "aaa", (Supplier) () -> 111 );
Run Code Online (Sandbox Code Playgroud)
这样编译器就知道你想要实现什么样的lambda.
相比之下,您可以编写以下内容,这在您的方法中会有不同的表现.
Log( "%s %d %s %d", "bbb", 222, (Callable) () -> "aaa", (Callable) () -> 111 );
Run Code Online (Sandbox Code Playgroud)