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