До сих пор мне удается найти все ответы, которые мне нужны, но это меня сбивает с толку. Скажем, у нас есть пример кода:Возвращаемое значение lambda в Java
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());
}
}
ОСА Учебное пособие (экзамен 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()
случае мы хотели игнорировать логический тип возврата метода.
Он знает, что может игнорировать возвращаемый тип в Runnable case, потому что run() возвращает void. И он знает, что не должен игнорировать возвращаемый тип в случае CheckAnimal, потому что test() не возвращает void. –
lambada делает то, что должен делать метод, если ваш метод содержит тип возвращаемого значения, тогда лямбда не укажет иначе, это ярлык для написания методов, поэтому не путайте себя – emotionlessbananas