有没有办法打印功能界面?

Is there a way to print a functional interface?

假设我有一个接口:

public interface Function {
    double function (double input);
}

现在,假设我已经在主 class、

中的某处创建了这个接口的实例
Function f = (x) -> x;

如何以纯文本打印此函数? 所以,有点像这样:

int f (double x) {return x}

运行 这个 Function 上的 .toString 打印类似 Main@6d06d69c 的内容。我怎样才能获得此接口的 java 表示?

不幸的是,答案(从 Java 9 开始)是没有一种简单的方法可以让 toString() 方法为您的任意实例提供对人类有意义的值功能界面。

以下是适用于某些用例的几个备选方案:

  • 不使用 lambda,而是使用 class 实现接口,并包含对 toString() 方法的适当覆盖。

  • 为所有 Function 个实例填充一个具有有意义名称的 Map<Function, String>

理论上可以构建一个库来检索(比如)lambda 的“.class”文件,对其进行分析,找出字节码的作用,然后生成适当的摘要.但这将是一个困难的项目。


如果有一个简单、干净的解决方案就好了。也许 "someone" 可以建议将其作为 Java 未来版本的 RFE。

请记住,函数的文本(也称为 "code")仅在您编写时才存在。您将其编译为字节码,然后在 Java 虚拟机上 运行。 运行时,您编写的原始代码已不存在,无法轻松检索。

您需要通过提供双精度值来显式调用接口中的方法,如下所示

Function f = (d) -> d;
System.out.print(f.function(2.0));