Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

(Java 8) java.util.function.Supplier

In the following code, I tried to call the info method taking a Supplier. (The info method is overloaded: one is taking a String and the other is taking a Supplier.) The compiler complains that "The method info(String) is not applicable for the argument Supplier<Double>". My expectation is to call the info method taking a Supplier by sending a Supplier object. Can I get some help to understand this error?

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

logger.info(randomSupplier); <----
like image 519
Steve Avatar asked Mar 02 '26 02:03

Steve


1 Answers

Assuming that your logger is a java.util.logging.Logger . . .

According to the Javadoc for Logger.info, it expects a Supplier<String>, and you're giving it a Supplier<Double>.

To fix this, you need to give it a Supplier<String>. You can write one either like this:

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

or like this:

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

You can even write:

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

and Java will magically infer that your lambda is meant to be a Supplier<String> (because the other overload of info doesn't take a functional interface type).

like image 132
ruakh Avatar answered Mar 04 '26 16:03

ruakh