LOGGER::info 不会消耗为 s -> LOGGER.info(s)
LOGGER::info is not consumed as s -> LOGGER.info(s)
我定义了一个记录器实例如下:
private static final Logger LOGGER = Logger.getLogger(Main.class.getName());
我有一个要记录的字符串数组,所以我使用了以下内容:
Arrays.stream(new String[]{"ABC", "DEF", "XYZ"}).forEach(LOGGER::info);
但是,日志中没有打印任何内容。但是,如果我将引用方法更改为等效的 lambda 形式,它会打印到日志中:
Arrays.stream(new String[]{"ABC", "DEF", "XYZ"}).forEach(s -> LOGGER.info(s));
我在这里错过了什么?
我也尝试了以下方法,它们的行为都一样:
Stream.of("ABC", "DEF", "XYZ").forEach(LOGGER::info);
List.of("ABC", "DEF", "XYZ").forEach(LOGGER::info);
甚至 Intellij IDE 也用黄色突出显示 s -> LOGGER.info(s)
,并建议将其更改为 LOGGER::info
。
我试图定义一个自定义 class:
static class Consumer
{
void consume(String s)
{
LOGGER.info(s);
}
}
并用它代替 LOGGER::info
:
Consumer consumer = new Consumer();
Arrays.stream(new String[]{"ABC", "DEF", "XYZ"}).forEach(consumer::consume);
它打印到日志中!
Logger
class有两个重载方法:
void info(String msg)
和
void info(Supplier<String> msgSupplier)
但我相信只有第一个可以分配给 void forEach(Consumer<? super T> action)
。
考虑该代码:
Arrays.stream(new String[]{"ABC"}).forEach(LOGGER::info);
Arrays.stream(new String[]{"ABC"}).forEach(s -> LOGGER.info(s));
区别在于第一种情况的消息来源是:
java.util.Spliterators$ArraySpliterator
第二个:
Main
可能您的记录器有一些过滤器不允许记录来自 java.util.Spliterators$ArraySpliterator
class.
的事件
尝试检查 LOGGER.getFilter()
的结果
我定义了一个记录器实例如下:
private static final Logger LOGGER = Logger.getLogger(Main.class.getName());
我有一个要记录的字符串数组,所以我使用了以下内容:
Arrays.stream(new String[]{"ABC", "DEF", "XYZ"}).forEach(LOGGER::info);
但是,日志中没有打印任何内容。但是,如果我将引用方法更改为等效的 lambda 形式,它会打印到日志中:
Arrays.stream(new String[]{"ABC", "DEF", "XYZ"}).forEach(s -> LOGGER.info(s));
我在这里错过了什么?
我也尝试了以下方法,它们的行为都一样:
Stream.of("ABC", "DEF", "XYZ").forEach(LOGGER::info);
List.of("ABC", "DEF", "XYZ").forEach(LOGGER::info);
甚至 Intellij IDE 也用黄色突出显示 s -> LOGGER.info(s)
,并建议将其更改为 LOGGER::info
。
我试图定义一个自定义 class:
static class Consumer
{
void consume(String s)
{
LOGGER.info(s);
}
}
并用它代替 LOGGER::info
:
Consumer consumer = new Consumer();
Arrays.stream(new String[]{"ABC", "DEF", "XYZ"}).forEach(consumer::consume);
它打印到日志中!
Logger
class有两个重载方法:
void info(String msg)
和
void info(Supplier<String> msgSupplier)
但我相信只有第一个可以分配给 void forEach(Consumer<? super T> action)
。
考虑该代码:
Arrays.stream(new String[]{"ABC"}).forEach(LOGGER::info);
Arrays.stream(new String[]{"ABC"}).forEach(s -> LOGGER.info(s));
区别在于第一种情况的消息来源是:
java.util.Spliterators$ArraySpliterator
第二个:
Main
可能您的记录器有一些过滤器不允许记录来自 java.util.Spliterators$ArraySpliterator
class.
尝试检查 LOGGER.getFilter()