(Java 8)Java.util.function.Supplier

(Java 8)Java.util.function.Supplier,java,java-8,supplier,Java,Java 8,Supplier,在下面的代码中,我尝试调用info方法获取供应商。info方法重载:一个接受字符串,另一个接受供应商。编译器抱怨infoString方法不适用于参数提供者。我的期望是通过发送一个Supplier对象来调用info方法获取一个Supplier。我能得到一些帮助来理解这个错误吗 Supplier<Double> randomSupplier = new Supplier<Double>() { public Double get() { return Math

在下面的代码中,我尝试调用info方法获取供应商。info方法重载:一个接受字符串,另一个接受供应商。编译器抱怨infoString方法不适用于参数提供者。我的期望是通过发送一个Supplier对象来调用info方法获取一个Supplier。我能得到一些帮助来理解这个错误吗

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

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

您可以尝试用Java8方式获取供应商,并通过将供应商转换为字符串来记录

假设您的记录器是java.util.logging.logger

根据,它需要一个供应商,而你给了它一个供应商

要解决这个问题,您需要给它一个供应商。你可以这样写:

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

Java会神奇地推断出您的lambda是供应商,因为另一个信息过载不采用功能接口类型。

似乎信息需要供应商。请发布更多信息什么是记录器类型?这是一个标准的日志软件包,我们可以查看它来查找信息过载,还是它是一个国产的软件包?请阅读并相应地增强您的问题。Sun:谢谢。我没有想到它是接受供应商,而不是供应商。我知道,如果我传递一个字符串,它就会编译。我想做的是调用一个重载的info,获取一个Supplier对象。这个方法是在Logger类中定义的。通过传递一个供应商对象。我正在传递一个实现供应商接口的匿名对象的实例;我试着解决上面的问题:private void infoSupplier randomSupplier{System.out.printlnandomsupplier.get;}这就是答案。我以为是供应商,不是供应商
final Supplier<String> randomSupplier =
    () -> Double.toString(Math.random());
logger.info(() -> Double.toString(Math.random()));