(Java 8) java.util.function.Supplier

(Java 8) java.util.function.Supplier

在下面的代码中,我尝试调用获取供应商的信息方法。 (info 方法被重载:一个接受字符串,另一个接受供应商。)编译器抱怨 "The method info(String) is not applicable for the argument Supplier<Double>"。我的期望是通过发送 Supplier 对象来调用获取 Supplier 的信息方法。我可以得到一些帮助来理解这个错误吗?

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

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

您可以尝试这种方式以 java 8 种方式获取 Supplier 并通过将 Supplier 转换为 String

进行记录
Supplier<Double> randomSupplier = () -> Math.random();
info(randomSupplier);

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

假设您的 loggerjava.util.logging.Logger 。 . .

根据 the Javadoc for 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 会神奇地推断出您的 lambda 应该是 Supplier<String> (因为 info 的另一个重载不采用功能接口类型)。