LOGGER :: info不作为s使用-> LOGGER.info

时间:2018-11-14 13:39:59

标签: java logging lambda java-stream method-reference

我已经定义了一个记录器实例,如下所示:

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


我试图定义一个自定义类:

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类具有两个重载方法:

void info(String msg)

void info(Supplier<String> msgSupplier)

我相信只有第一个可分配给void forEach(Consumer<? super T> action)

1 个答案:

答案 0 :(得分:3)

考虑该代码:

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类中的事件。

尝试检查LOGGER.getFilter()的结果