Почему я не могу использовать массив String с методом, принимающим Iterable в качестве параметра? - PullRequest
2 голосов
/ 11 января 2010

Я пытаюсь написать свою собственную "функциональную" маленькую библиотеку на Java. Если у меня есть эта функция:

public static <T> List<T> filter(Iterable<T> source,BooleanTest predicate)
{
    List<T> results = new ArrayList<T>();
    for(T t : source)
    {
         if(predicate.ok(t))
            results.add(t);
    }
    return results;
}

почему я не могу использовать его с этим фрагментом:

String strings[] = {"one","two","three"};
List<String> containingO = IterableFuncs.filter(strings,new BooleanTest() {
   public boolean ok(String obj) {
     return obj.indexOf("o") != -1;
   }
});

Насколько я знаю, массив Java реализует Iterable, верно? Что необходимо изменить, чтобы функция работала как с массивами, так и с коллекциями? Выбрав Iterable в качестве первого параметра, я решил, что охватил все случаи.

Ответы [ 4 ]

11 голосов
/ 11 января 2010

Массивы, к сожалению, не реализуют никаких интерфейсов в Java. расширенный цикл for работает с массивами и , отдельно.

Однако вы можете использовать Arrays.asList(T...), чтобы обернуть массив в List<T>, что является итеративным.

С точки зрения "функциональной библиотеки", вам, вероятно, стоит взглянуть на Google Collections , в которой много подобных вещей.

2 голосов
/ 11 января 2010

Java-массивы , а не Iterable, хотя расширенный цикл for может итерировать по ним.

Обычный способ справиться с этим:

public void doStuff(String... args) {
  doStuff(Arrays.asList(args));
}

и либо:

public void doStuff(Iterable<String> args) {
  ...
}

или

public void doStuff(Collection<String> args) {
  ...
}
1 голос
/ 11 января 2010

Согласен, это раздражает.

Вы можете перегрузить фильтр () таким образом ...

public static <T> List<T> filter(T[] source, BooleanTest predicate)
{
    return filter(Arrays.asList(source), predicate);
}
0 голосов
/ 11 января 2010

массивы предназначены для облегчения. они не реализуют итеративные.

к сожалению, вам потребуется перегрузить, т.е. написать другую версию того же метода для типа массива или преобразовать его в коллекцию (что будет менее эффективно).

...