使用Log4J2进行惰性日志记录中的“可以用方法引用替换Lambda”

时间:2019-07-09 14:01:08

标签: java logging lambda

我想通过使用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时,我会失去全部利益吗?

1 个答案:

答案 0 :(得分:1)

看看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<?>仅在启用级别后才被调用,从而使其变得很懒。

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