gpt4 book ai didi

java - "Lambda can be replaced with method reference"in Lazy Logging with Log4J2

转载 作者:行者123 更新时间:2023-11-30 10:02:25 25 4
gpt4 key购买 nike

我想通过使用 lazy logging in Log4J2 提高我的日志记录效率.

这意味着我正在使用 lambda,它仅在日志级别正确/满足时执行。

例子:

List<Integer> someList = Arrays.asList(1,2,3);
log.info("Size of list is {}.", () -> someList.size());

我的 IDE 告诉我,我可以像这样用方法引用替换这个符号:

log.info("Size of list is {}.", someList::size);

我的问题现在是:这种方法(方法引用)是否仍然具有惰性日志记录的好处,即昂贵的计算任务仅在日志记录中执行,当日志级别达到或当我没有明确使用 lambda 时,我会失去全部好处吗?

最佳答案

看一下Log4j2源码,你会发现Logger类正在定义 Supplier<?>让它变得懒惰,例如在其中一个 AbstractLogger.logIfEnabled() method你可以找到:

@Override
public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
final Supplier<?>... paramSuppliers) {
if (isEnabled(level, marker, message)) {
logMessage(fqcn, level, marker, message, paramSuppliers);
}
}

Supplier<?>只有在启用关卡时才会调用,使其变得懒惰。

如果您提供 Supplier 没有区别使用 lambda、方法引用或通过编写 new Supplier() { }匿名类。你可以看看Do lambda expressions have any use other than saving lines of code?理解这些方法之间细微差别的问题,但最重要的是它们会很懒惰。

关于java - "Lambda can be replaced with method reference"in Lazy Logging with Log4J2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56954328/

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