我会尽量小心我的措辞,因为 lambda 本质上只是一个方法签名和主体。
我的问题的前提是,能够保持简洁的语法 lambda,并且能够有一个人类可读的名称(字符串)来识别它,即当您注销它时,这将非常有用。
以前,使用匿名类,我总是可以覆盖 toString。
final Runnable runnable = new Runnable() {
@Override public void run() { System.out.println("1"); }
@Override public String toString() { return "anonymous-1"; }
}
场景
以下是我发现自己需要恢复到代码才能解密的场景
问题
由于没有伴随的 toString 那么当您尝试注销 lambda 引用时,您会在日志中获得所有信息,例如:
MyClass$$Lambda$1/424058530@1c20c684
联系方式
欣赏人们在这方面和周围的想法和经验。
最佳答案
这是一个中间地带,它在语法上更紧凑,只是回到内部类 - 一个 Runnable-with-toString 工厂。
static Runnable makeRunnable(Runnable r, Supplier<String> toStringFn) {
return new Runnable() {
public void run() { r.run(); }
public String toString() { return toStringFn.get(); }
};
}
现在,在使用站点,您可以:
Runnable r = makeRunnable(() -> System.out.println("1"),
() -> "anonymous-1");
(如果你没有理由相信 toString 方法需要访问任何状态,你可以把第二个参数变成
String
而不是 Supplier<String>
。)
关于logging - 如何为 lambda 记录人类可读的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33170053/