Java 可变参数传递 lambda 和值

标签 java lambda variadic-functions

我试图在 varag 中结合 lambda 和简单值。

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

错误:方法 Log 不能应用于给定类型;所需字符串,对象 [] 找到:字符串,字符串,整数,()->“aaa”,()->111 原因:可变参数不匹配;对象不是函数式接口(interface)

是否可以将 lambda 和值都传递给可变参数?

最佳答案

问题在错误信息中

Object is not a functional interface

你只能为功能接口(interface)(一个只有一个抽象方法)创建一个 lambda 对象不是一个接口(interface),它没有任何抽象方法,所以你不能创建这种类型的 lambda。你能做的是

Log( "%s %d %s %d", "bbb", 222, (Supplier) () -> "aaa", (Supplier) () -> 111 );  

这样编译器就知道您打算实现哪种 lambda。

相比之下,您可以编写以下内容,这在您的方法中的行为会有所不同。

Log( "%s %d %s %d", "bbb", 222, (Callable) () -> "aaa", (Callable) () -> 111 );  

关于Java 可变参数传递 lambda 和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40086560/

相关文章:

java - 如何多次重复使用线条?

java - 如何使用 JDBCTemplate 向外键插入空值

java - 求n个数的GCD

c++ - 如何从 std::function 中提取和执行目标

c++ - VSCode错误: "incorrect use of va_start"

multithreading - 保存 fprintf 调用的变量参数列表

java - Scala 中的 @remote 注解类型不匹配

c++ - 在捕获 `this->` 的 lambda 中使用 `this`

c++ - va_arg 是否使用重整前或重整后类型作为其第二个参数?

java - 用于关闭我的 SocketConversation 的 Lambda 表达式