#java
#java
Вопрос:
Недавно мне пришла в голову идея создать следующий метод:
/** Returns a {@link Predicate} which tests whether all its elements match a condition passed as argument. */
private static <T> Predicate<Iterable<T>> allIterableElementsMatch(Predicate<T> elementMatchCondition) {
return iterable -> stream(iterable).allMatch(elementMatchCondition);
}
Затем я решил объявить Function
-field вместо объявления метода выше.
Самое близкое некомпилируемое решение, которое я мог бы предоставить, это:
private static final Function<Predicate<?>, Predicate<Iterable<?>>> allIterableElementsMatch =
condition -> iterable -> stream(iterable).allMatch(condition);
Это не компилируется (IDE выделяется condition
внутри allMatch(...)
) по следующей причине:
Мои вопросы:
- Возможно ли это реализовать таким образом, или я просто неправильно понимаю концепцию использования функциональных интерфейсов?
- Возможно ли специализировать некоторый тип в
Function
объявлении -s, как в методе, который я показал?
Ответ №1:
Для системы типов ?
from Predicate<?>
и ?
from Predicate<Iterable<?>>
— это разные вещи. Вы можете сделать:
private static <T> Function<Predicate<T>, Predicate<Iterable<T>>> func() {
return condition -> iterable -> StreamSupport.stream(iterable.spliterator(), false).allMatch(condition);
}
Комментарии:
1. Здравствуйте. Спасибо за ваш ответ. Идея в том, что я хотел бы объявить поле, но не метод. Возможно ли это, по вашему мнению?
2. @GromovAnton нет, это не так, возможно, вы захотите подробнее прочитать о методах «захвата подстановочных знаков»…
3. в заключение, в этом случае нет способа сообщить компилятору, что оба ‘?’ относятся к одному и тому же типу, я прав?
4. @GromovAnton да, это правильно. говорят, что преобразование захвата происходит везде