Код не должен компилироваться, но компилируется!
public class MyClass {
...........
private void setEndDateOfValidStatusToCurrentTime(List<LifecycleStatus> oldStatuses, Date currentTime)
{
oldStatuses.stream()
.filter(oldStatus -> isValidNow(oldStatus, currentTime))
.findFirst().ifPresent(oldStatus -> oldStatus.setValidToDate(currentTime));
}
private boolean isValidNow(LifecycleStatus lifecycleStatus, Date currentTime)
{
Date start = lifecycleStatus.getValidFromDate();
Date end = lifecycleStatus.getValidToDate();
Date startTime = Optional.ofNullable(start).orElse(new Date(0L)); // BEGINNING OF TIME
Date endTime = Optional.ofNullable(end).orElse(new Date(Long.MAX_VALUE)); // END OF TIME
return startTime.before(currentTime) && endTime.after(currentTime);
}
}
Причина: я использую isValidNow() в лямбда-выражении, чтобы ориентироваться на интерфейс Predicate, поскольку этого требует метод фильтра. Но isValidNow() — это метод с двумя аргументами, а test() в Predicate принимает только один аргумент!
Я знаю, что компилятор Java обладает способностью выводить типы. С такой мощью умный компилятор, возможно, внутренне разбивает isValidNow(), определяет, что он может безопасно отложить второй аргумент (currentTime) и предлагает реализацию, которая удовлетворяет test() в Predicate, используя только первый аргумент (oldStatus). .
Тогда почему не работает вывод типов, когда я пытаюсь вместо этого использовать ссылку на метод? Интересно, если я заменю
filter(oldStatus -> isValidNow(oldStatus, currentTime))
с
filter(this::isValidNow)
Я вижу эти ошибки компилятора:
- The method filter(Predicate<? super LifecycleStatus>) in the type Stream<LifecycleStatus> is not applicable for the arguments
(this::isValidNow)
- MyClass does not define isValidNow(LifecycleStatus) that is applicable here