如何在Java 8中使Lambda表达式定义toString?
我不想让普通的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
但是,您可以使用虚拟扩展方法来实现。注意:下面的代码是未测试的:
@FunctionalInterfacepublic 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());
}
}
我建议使用此解决方案,因为您正在使用String.format()
该接口。
或者,您可以定义自己的界面。甚至写了这个接口,它调用的包装.toString()
在.asString()
。选择很多。
以上是 如何在Java 8中使Lambda表达式定义toString? 的全部内容, 来源链接: utcz.com/qa/415332.html