(Java 8)java.util.function.Supplier

Ste*_*eve 0 java java-8 supplier

在下面的代码中,我尝试将info方法称为供应商.(info方法重载:一个是String,另一个是供应商.)编译器抱怨"方法info(String)不适用于参数Supplier<Double>".我的期望是通过发送供应商对象来调用info方法来获取供应商.我可以帮助理解这个错误吗?

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

logger.info(randomSupplier); <----
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 6

假设你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());
        }
    };
Run Code Online (Sandbox Code Playgroud)

或者像这样:

final Supplier<String> randomSupplier =
    () -> Double.toString(Math.random());
Run Code Online (Sandbox Code Playgroud)

你甚至可以写:

logger.info(() -> Double.toString(Math.random()));
Run Code Online (Sandbox Code Playgroud)

并且Java将神奇地推断出你的lambda是一个Supplier<String>(因为其他重载info并不采用功能接口类型).