(Java 8) java.util.function.Supplier - PullRequest
       10

(Java 8) java.util.function.Supplier

0 голосов
/ 01 сентября 2018

В следующем коде я попытался вызвать информационный метод, взяв поставщика. (Информационный метод перегружен: один получает строку, а другой - поставщик.) Компилятор жалуется, что «Метод info (строка) не применим для аргумента Supplier<Double>». Я ожидаю, что вызову информационный метод берет поставщика, отправив объект поставщика. Могу ли я получить помощь, чтобы понять эту ошибку?

Supplier<Double> randomSupplier = new Supplier<Double>()
{   public Double get()
    {   return Math.random(); }    
};

logger.info(randomSupplier); <----

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Предполагая, что ваш logger является java.util.logging.Logger. , .

Согласно Javadoc для Logger.info, он ожидает Supplier<String>, а вы даете ему Supplier<Double>.

Чтобы это исправить, нужно дать ему Supplier<String>. Вы можете написать один из них так:

final Supplier<String> randomSupplier =
    new Supplier<String>() {
        public String get() {
            return Double.toString(Math.random());
        }
    };

или как это:

final Supplier<String> randomSupplier =
    () -> Double.toString(Math.random());

Вы даже можете написать:

logger.info(() -> Double.toString(Math.random()));

и Java будет магическим образом выводить, что ваша лямбда должна быть Supplier<String> (потому что другая перегрузка info не принимает функциональный тип интерфейса).

0 голосов
/ 01 сентября 2018

Вы можете попробовать этот способ получить Supplier в java 8 way и войти в систему, преобразовав Supplier в String

Supplier<Double> randomSupplier = () -> Math.random();
info(randomSupplier);

  private void info(Supplier<Double> randomSupplier) {
    System.out.println(randomSupplier.get());
 }
...