有没有办法打印功能界面?
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));
假设我有一个接口:
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));