我正在尝试用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作为第一个参数,我认为我已经涵盖了所有案例。
答案 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)
数组设计为轻量级。他们没有实现可迭代。
不幸的是,您需要重载,即为数组类型编写相同方法的另一个版本,或将其转换为集合(效率较低)。