Есть ли Java 1.5 эквивалентный методам Predicate <T>в .Net? - PullRequest
8 голосов
/ 25 апреля 2009

В частности, я ищу аналогичные чистые обозначения для Collection<T>.TrueForAll / Exists и т. Д.

Воняет, что приходится писать цикл foreach для проверки возврата метода для каждого объекта, поэтому я надеюсь, что для него есть более подходящая идиома Java.

Ответы [ 3 ]

12 голосов
/ 25 апреля 2009

Предикаты предоставляются в библиотеке Google Collections .

6 голосов
/ 25 апреля 2009

Функциональная 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
  }  
}
4 голосов
/ 25 апреля 2009

Насколько я знаю, нет. Но у Apache Commons Collections есть что-то вроде этого: Predicate


Редактировать : Правильно, как отмечено в комментариях, Коллекции общин из мира пре-дженериков, поэтому Коллекции Google ( обновление ) : Гуава ) теперь выглядит явно лучше. Тем не менее, коллекции Commons заслуживают упоминания, поскольку это хорошо известная библиотека, которая делает это, а также чтобы люди знали, , почему не использовать ее. :)

Я только что прочитал больше о Google Collections в этом хорошем интервью с его основными разработчиками и хотел бы процитировать немного, который конкретно касается проблемы «Коллекции Google против Apache Commons Collections»:

Что является уникальным в вашем подходе? Чем он отличается, например, от коллекция Apache Commons?

Кевин: «Ну, слава Богу за апача Commons. Мы все были бы в плохой форме без библиотек, как это. Тот сказал, к сожалению, этот конкретный проект застопорился в мире перед дженериками. Они хотят принять дженерики, но они признают, что это будет связано с довольно нетривиально и несовместимо переписать. Пока что, похоже, никто активно вождения такие усилия. В Google мы использовали Java 5 всей компании с весны 2005 года. Библиотека коллекций непроизведенный был нарушителем нас, потому что мы действительно ненавидим предупреждения компилятора. Я тоже обеспокоен многими местами в что коллекции Apache не делают соответствовать спецификациям Интерфейсы JDK, которые они реализуют. "

[...]

Джаред: «Как предполагает Кевин, наша библиотека это единственная библиотека коллекций, которую я знаю из, вне JDK, построенный с Java 5 особенности: дженерики, перечисления, коварианты типы возврата и т. д. При написании Java 5 код, вы хотите библиотеку коллекций что в полной мере использует язык. Кроме того, мы ставим огромный усилия по созданию библиотеки полный, надежный и соответствующий классы коллекции JDK. наш классы коллекции были намного больше ограничено изначально, но мы постепенно улучшил их за последние два года. Поскольку все использование библиотеки в Google Система контроля источника, у нас было гибкость, чтобы изменить публику интерфейсы. Проект с открытым исходным кодом как коллекция Apache Commons не иметь свободу, чтобы изменить его поведение после первоначального выпуска. Так как мы потеряем эту гибкость однажды Библиотека коллекций Google 1.0 является выпущен, мы хотим получить обратная связь сейчас, чтобы мы могли получить вещи право. "

...