为什么我不能使用带有Iterable作为参数的方法的String数组?

时间:2010-01-11 20:50:03

标签: java generics interface functional-programming

我正在尝试用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 个答案:

答案 0 :(得分:11)

不幸的是,数组没有在Java中实现任何接口。 enhanced for loop分别适用于数组 iterables。

但是,您可以使用Arrays.asList(T...)将数组包装在可迭代的List<T>中。

就“功能库”方面而言,你应该看看Google Collections,其中有很多类似的东西。

答案 1 :(得分:2)

Java数组 Iterable,即使增强的for循环可以迭代它们。

我处理这个问题的通常方法是:

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

和其中之一:

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

或:

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

答案 2 :(得分:1)

我同意,这很烦人。

你可以重载filter()......

public static <T> List<T> filter(T[] source, BooleanTest predicate)
{
    return filter(Arrays.asList(source), predicate);
}

答案 3 :(得分:0)

数组设计为轻量级。他们没有实现可迭代。

不幸的是,您需要重载,即为数组类型编写相同方法的另一个版本,或将其转换为集合(效率较低)。