LOGGER :: информация не используется как s -> LOGGER.info (s) - PullRequest
0 голосов
/ 14 ноября 2018

Я определил экземпляр регистратора следующим образом:

private static final Logger LOGGER = Logger.getLogger(Main.class.getName());

У меня есть массив строк, которые я хочу регистрировать, поэтому я использовал следующее:

Arrays.stream(new String[]{"ABC", "DEF", "XYZ"}).forEach(LOGGER::info);

Однако,в журнал ничего не печатается.Но если я изменю ссылочный метод на эквивалентную лямбда-форму, он напечатает в журнале:

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 голосов
/ 14 ноября 2018

Считайте, что код:

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

...