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);

它打印到日志中!


Loggerclass有两个重载方法:

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()

的结果