如何为lambda记录人类可读的字符串?

时间:2015-10-16 12:03:05

标签: logging lambda java-8

我会尝试用我的措辞非常小心,因为lambda本质上只是一个方法签名和正文。

我的问题的前提是能够保持简洁的语法lambda非常有用,并且能够使用人类可读的名称(字符串)来识别它,即当您将其注销时。

以前,使用匿名类我总是可以覆盖toString。

final Runnable runnable = new Runnable() {  
  @Override public void run() { System.out.println("1"); }
  @Override public String toString() { return "anonymous-1"; }
}

方案

以下是我发现自己需要恢复代码以便能够消除

的情况
  1. 这种情况的一个用法是你有另一个函数的lambda参数,在你的日志中你希望能够打印出传入的特定lambda /实现。比如,你有一个消费者拿了一个字符串,你有这个的实现,打印出一个问候加上多种语言的字符串。如此命名策略,用法语","用西班牙语"来命名。
  2. 你有一套Runnable说,每个都要轮流申请,你想要注销那套的内容。
  3. 问题 因为没有伴随toString,所以当你尝试注销lambda引用时,你会在日志中获得所有内容,例如:

    MyClass$$Lambda$1/424058530@1c20c684
    

    途径

    1. 我想你总是可以引用lambda和 capture 中的记录器,这样当执行lambda时你可以打印一个静态字符串来识别lambda。
    2. 前言lambda善良,并恢复到匿名课程......不能吃蛋糕,吃它,所以说。
    3. 欣赏人们在此期间及其周围的想法和经历。

1 个答案:

答案 0 :(得分:7)

这里有一个中间地带,它在语法上更紧凑,只是回到内部类 - 一个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>。)