Существует ли Java 1.5, эквивалентный методам Predicate<T> в .Net?
-
16-09-2019 - |
Вопрос
В частности, я ищу аналогичную чистую нотацию для Collection<T>.TrueForAll
/ Exists
, и т.д.
Кажется неприятным писать цикл foreach для проверки возврата метода для каждого объекта, поэтому я надеюсь, что для этого есть лучшая идиома Java.
Решение
Предикаты предоставляются в Коллекции Google библиотека.
Другие советы
Функциональная Java обеспечивает первоклассные функции.Предикат выражается как F<T, Boolean>
.Например, вот программа, которая проверяет массив на наличие строки, состоящей из строчных букв.
import fj.F;
import fj.data.Array;
import static fj.data.Array.array;
import static fj.function.Strings.matches;
public final class List_exists {
public static void main(final String[] args) {
final Array<String> a = array("Hello", "There", "how", "ARE", "yOU?");
final boolean b = a.exists(matches.f("^[a-z]*$"));
System.out.println(b); // true
}
}
Насколько я знаю, нет.Но Apache Коллекции Commons есть что-то вроде этого: Predicate
Редактировать:Верно, как отмечалось в комментариях, коллекции Commons относятся к миру до создания дженериков, так что Коллекции Google (Обновить: Гуава) сейчас кажется явно лучшим вариантом.Тем не менее, Commons Collections заслуживает упоминания, поскольку это хорошо известная библиотека, которая делает это, а также для того, чтобы люди знали почему не использовать его.:)
Я просто читал больше о коллекциях Google в этом разделе приятное интервью с его основными разработчиками и хотел бы процитировать немного, что конкретно касается "Коллекций Google противПроблема с коллекциями Apache Commons":
В чем уникальность вашего подхода?Чем она отличается, например, коллекция Апач Викискладе?
Кевин:"Что ж, слава Богу за Apache Commons.Мы все были бы в плохом состоянии без подобных библиотек.Это говорит о том, что, к сожалению, этот конкретный проект застопорился в мире до появления дженериков.Они действительно хотят использовать дженерики, но они признают, что это потребовало бы довольно нетривиального и несовместимого переписывания.До сих пор, кажется, никто не будет активно управляя такие усилия.В Google мы используем Java 5 В масштабах всей компании с весны 2005 года.То, что библиотека коллекций не была обобщена, нарушило условия сделки для нас, потому что мы действительно ненавидим получать предупреждения компилятора.Я также был обеспокоен многими местами, в которых коллекции Apache не соответствуют спецификациям интерфейсов JDK, которые они реализуют. "
[...]
Джаред:"Как подразумевает Кевин, наша библиотека это единственная известная мне библиотека collections за пределами JDK, созданная на Java 5 особенности:обобщения, перечисления, ковариантные возвращаемые типы и т.д.При написании кода Java 5 требуется библиотека коллекций , которая в полной мере использует преимущества языка .Кроме того, мы приложили огромные усилия для создания библиотеки полной, надежной и совместимой с классами коллекции JDK.Наши классы коллекционирования были намного более ограниченными изначально, но мы постепенно улучшали их в течение последних двух лет.Поскольку вся библиотека используется в системе управления версиями Google , у нас появилась возможность гибко изменять общедоступные интерфейсы.Проект с открытым исходным кодом такой как Apache Commons Collection, не имеет свободы изменять свое поведение после первоначального выпуска.Поскольку мы потеряем эту гибкость после выхода Библиотеки коллекций Google 1.0 , мы с нетерпением ждем отзывов сейчас, чтобы мы могли все исправить ".