在 Java 中按 lambda 返回值
直到现在,我设法找到我需要的所有答案,但这个让我感到困惑。假设我们有示例代码:
public class Animal {
private String species;
private boolean canHop;
private boolean canSwim;
public Animal(String speciesName, boolean hopper, boolean swimmer) {
species = speciesName;
canHop = hopper;
canSwim = swimmer;
}
public boolean canHop() { return canHop; }
public boolean canSwim() { return canSwim; }
public String toString() { return species; }
}
public interface CheckAnimal {
public boolean test(Animal a);
}
public class FindSameAnimals {
private static void print(Animal animal, CheckAnimal trait) {
if(trait.test(animal)){
System.out.println(animal);
}
public static void main(String[] args) {
print(new Animal("fish", false, true), a -> a.canHop());
}
}
OCA学习指南(考试1Z0-808)一书说,这两行是等效的:
a -> a.canHop()
(Animal a) -> { return a.canHop(); }
这是否意味着,在幕后,Java在第一种情况下将关键字添加到代码中?
如果答案是肯定的,那么下一个代码如何编译(想象一下其他所有内容都在适当的位置):
static int counter = 0;
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> counter++));
如果我们知道执行和 Runnable 运行的签名是:
void execute(Runnable command)
void run()
如果答案是否定的,那么Java如何知道何时需要返回某些内容,何时不需要返回?也许在
a -> a.canHop()
我们想要忽略布尔返回类型的方法。