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

我想通过在 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);

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


饮歌长啸
浏览 176回答 1
1回答

阿晨1998

查看 Log4j2 源代码,您会发现该类Logger定义Supplier<?>为使其惰性,例如在您可以找到的AbstractLogger.logIfEnabled()方法之一中:@Overridepublic void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Supplier<?>... paramSuppliers) {&nbsp; &nbsp; &nbsp; &nbsp; if (isEnabled(level, marker, message)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logMessage(fqcn, level, marker, message, paramSuppliers);&nbsp; &nbsp; &nbsp; &nbsp; }}Supplier<?>只有在启用关卡时才会调用 ,使其变得懒惰。Supplier如果您提供使用 lambda、方法引用或通过编写new Supplier() { }匿名类,这没有区别。您可以看看Do lambda expressions have any use except saving lines code?&nbsp;了解这些方法之间的细微差别的问题,但最重要的是它们会很懒惰。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java