OCPJP 8 II 消费者与供应商 IZ0-809



我正在尝试获得IZO-809认证 我正在阅读OCA/OCP SE8测试书,一个代码确实引起了我的注意。

代码让我想到了这个问题。

我知道消费者得到一个参数,没有返回任何内容,供应商没有参数并返回一个值。

但是这段代码在 -> 之后几乎是一样的。

public class Pregunta24{
private final Object obj;
public Pregunta24(final Object obj){
this.obj = obj;
}    
}
//Returns a Supplier
private final Supplier<Pregunta24>supplier = ()->new Pregunta24("HI");
//Returns a Consumer.
private final Consumer<Pregunta24>consumer = a->new Pregunta24(a);

两个代码都有效。

但是如果这段代码不起作用,我知道消费者不会返回任何内容。

private final Consumer<String>consumerString = String::length

我知道这不起作用,因为消费者不返回值,我的问题是在供应商代码和消费者代码中,代码紧随 -> 标记之后,但这次被认为是返回实际上是类的一个实例。

我的问题是为什么有时 Java 抱怨这是一个返回值而不是?

我的意思是这段代码。

private final Supplier<Pregunta24>supplier = ()->new Pregunta24("HI");
// I would think is returning a instance of the Pregunta24 class.
private final Consumer<Pregunts24>consumer = a->new Pregunta24(a);

在 -> 之后返回相同的内容,但为什么在消费者中不说错误。

incompatible types: bad return type in lambda expression

但如果这样做,我会这样做

final Consumer<String>consumerString = a->1;

我认为 -> 之后的代码是上下文推断的。

根据javadoc Consumer:

表示接受单个输入参数的操作,并且 不返回任何结果。

Consumer<Pregunts24>consumer = a->new Pregunta24(a);

实际上不返回任何内容。这基本上是Consumer#accept方法的实现,该方法接受类型为T的对象,并将void作为返回类型。

public void accept(Pregunta24 a) {
new Pregunta24(a);
}

你没有归还任何东西。同样的事情

Consumer<String>consumerString = String::length
public void accept(String a) {
a.length();
}

然而

Consumer<String>consumerString = a->1;

是一个无效的表达式,转换为如下所示的内容:

public void accept(String a) {
1;
}

最新更新