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

标签 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"; }
}

场景

以下是我发现自己需要恢复到代码才能解密的场景
  • 一个使用场景是你有另一个函数的 lambda 参数,并且在你的日志中你希望能够打印出正在传入的特定 lambda/实现。例如,你有一个消费者字符串,您已经实现了它,可以打印出问候语和多种语言的字符串。最好为策略命名,比如“用法语”、“用西类牙语”。
  • 你有一组 Runnable 说,每个都依次应用,并且你想注销该组的内容。

  • 问题
    由于没有伴随的 toString 那么当您尝试注销 lambda 引用时,您会在日志中获得所有信息,例如:
    MyClass$$Lambda$1/424058530@1c20c684
    

    联系方式
  • 我想你总是可以引用 lambda 中的记录器并捕获它,这样当 lambda 被执行时,你可以打印一个静态字符串来识别该 lambda。
  • 放弃 lambda 善良,并恢复到匿名类......不能吃蛋糕,可以这么说。

  • 欣赏人们在这方面和周围的想法和经验。

    最佳答案

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

    相关文章:

    java - ZonedDateTime 和 OffsetDateTime 有什么区别?

    java - JDK8中的CompletableFutures什么时候会阻塞执行线程?

    python - 导入的模块添加了不需要的日志记录。怎样才能抑制呢?

    c# - 可以使用 LINQ 或 lambda 来执行矩阵运算吗?

    c# - 委托(delegate) System.Action 不接受 1 个参数

    java - 如何使用 Java 8 特性生成集合?

    asp.net - NLog 在 appsettings 中使用连接字符串名称

    python - 如何自定义 Python 日志记录的时间格式?

    java - 用于消息驱动 Bean 的 Log4j

    C++11 作为回调传递的空函数的优化