我正在尝试获得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;
}