Java vararg传递lambda和值

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?

Pet*_*rey 5

问题出在错误消息中

对象不是功能接口

您只能为功能接口创建一个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)