java - 如何让 lambda 表达式在 Java 8 中定义 toString?

标签 java lambda java-8

我不想让普通的 lambda 实现一个方法并将它的 toString 重新定义为附加值。我希望 lambda 表达式只实现 toString 方法。 我知道我表达得不是很好,但我相信你会通过这个例子理解我的意思。

public class LambdaToStringTest {

    public interface ToStringInterface {
        public abstract String toString();
    }

    public static void main(String[] args) {
        print("TRACE: %s", (ToStringInterface)()->someComputation()); // <<-- ERROR: The target type of this expression must be a functional interface
    }

    private static void print(String format, Object... args) {
        System.out.println(String.format(format, args));
    }

}

如果我更改方法的名称,它会编译,但它不会覆盖 toString,因此 print 方法不会打印预期的内容。

这是尝试定义一个日志子系统,它仅在需要时(真正要打印时)评估 lambda,但与非 lambda 参数兼容。我知道实现它的其他方法,但我想知道为什么我不能这样做,如果有解决方法或者我做错了什么,

最佳答案

简短的回答,你不能。 @FunctionalInterface 不能用于“覆盖”Object 的方法。

但是,您可以使用虚拟扩展方法实现 Formattable。注意:以下代码未经测试:

@FunctionalInterface
public interface ToStringInterface
    extends Formattable
{
    String asString();

    @Override
    default void formatTo(Formatter formatter, int flags, int width, int precision)
    {
        formatter.format("%s", this);
        // Or maybe even better:
        formatter.out().append(this.asString());
    }
}

我提出这个解决方案是因为您正在使用利用此接口(interface)的 String.format()

或者您可以只定义自己的接口(interface)。或者甚至为此接口(interface)编写一个包装器,在 .asString() 中调用 .toString()。选择很多。

关于java - 如何让 lambda 表达式在 Java 8 中定义 toString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23628631/

相关文章:

python - 如何修改 lambda 函数中的变量?

c++ - 在 lambda 函数中使用 auto

c++ - C++11 中的递归 lambda 实现

java流比较列表与局部变量

java - Android 线程/处理程序错误 IllegalStateException : The specified message queue synchronization barrier token has not been posted

java - Karate BDD 框架通过简单的配置抛出 NPE

java - 如何运行一个新进程,并关闭 Java 中的当前程序?

java - 开普勒内存使用情况

ssl - javax.net.ssl.SSLHandshakeException : No appropriate protocol

Java 8 的流 : why parallel stream is slower?