gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:42:39 26 4
gpt4 key购买 nike

我会尽量小心我的措辞,因为 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com