【发布时间】:2016-11-27 04:27:41
【问题描述】:
到目前为止,我设法找到了我需要的所有答案,但这一个让我感到困惑。假设我们有示例代码:
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 Study Guide (Exam 1Z0-808) 书说这两行是等价的:
a -> a.canHop()
(Animal a) -> { return a.canHop(); }
这是否意味着,Java 在幕后为第一种情况的代码添加了关键字 return?
如果答案是肯定的,那么接下来的代码将如何编译(想象其他一切都在适当的位置):
static int counter = 0;
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> counter++));
如果我们知道 execute 和 Runnable 的 run 的签名是:
void execute(Runnable command)
void run()
如果答案是否定的,那么 Java 怎么知道什么时候需要返回,什么时候不需要呢?也许在
a -> a.canHop()
我们想忽略 boolean 方法返回类型的情况。
【问题讨论】:
-
它知道它可以忽略 Runnable 情况下的返回类型,因为 run() 返回 void。它知道它不能忽略 CheckAnimal 案例中的返回类型,因为 test() 不会返回 void。
-
lambada 做了一个方法应该做的事情,如果你的方法包含返回类型,那么 lambda 将提供否则不提供,这是编写方法的捷径所以不要混淆自己