簡體   English   中英

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

[英]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


我試圖定義一個自定義類:

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)

考慮以下代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM