Java 为什么可以';我是否使用字符串数组和一个以Iterable作为参数的方法?
我正试图用Java编写自己的“功能性”小库。如果我有这个功能:Java 为什么可以';我是否使用字符串数组和一个以Iterable作为参数的方法?,java,generics,interface,functional-programming,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))
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;
}
publicstaticlist过滤器(Iterable源代码,booleanstest谓词)
{
列表结果=新建ArrayList();
for(T:source)
{
if(谓词ok(t))
结果:添加(t);
}
返回结果;
}
为什么我不能将其用于此代码段:
String strings[] = {"one","two","three"};
List<String> containingO = IterableFuncs.filter(strings,new BooleanTest() {
public boolean ok(String obj) {
return obj.indexOf("o") != -1;
}
});
String字符串[]={“一”、“二”、“三”};
列表containingO=IterableFuncs.filter(strings,new booleanstest()){
公共布尔ok(字符串obj){
返回对象索引of(“o”)!=-1;
}
});
据我所知,Java数组实现了Iterable,对吗?要使函数与数组以及集合一起工作,需要更改哪些内容?通过选择Iterable作为第一个参数,我想我涵盖了所有情况。不幸的是,数组在Java中没有实现任何接口。它们分别在阵列和iterables上工作 但是,您可以使用将数组包装到可编辑的
列表中
关于“函数库”方面的内容,您可能应该看看其中有很多类似的内容。Java数组不可Iterable
,即使增强的for
循环可以迭代它们
我通常的处理方法是:
public void doStuff(String... args) {
doStuff(Arrays.asList(args));
}
以及:
public void doStuff(Iterable<String> args) {
...
}
public void doStuff(Iterable参数){
...
}
或:
public void doStuff(集合参数){
...
}
阵列设计为轻量级。他们没有实现iterable
不幸的是,您需要为数组类型编写相同方法的另一个版本,或者将其转换为集合(效率较低)。我同意,这很烦人
您可能会导致筛选器()过载
public static <T> List<T> filter(T[] source, BooleanTest predicate)
{
return filter(Arrays.asList(source), predicate);
}
公共静态列表过滤器(T[]源代码,布尔测试谓词)
{
返回过滤器(Arrays.asList(source),谓词);
}
那么,我需要实现两个版本?一个采用Iterable
,一个采用可变长度参数?或者首先从集合开始。是的,但也能使用数组会很好。Geo,优秀的Java泛型和集合一书基本上建议将数组视为不推荐的类型。对于我自己的API,我总是倾向于避免使用数组。我甚至不会将数组视为不推荐使用的数组,尽管我通常会避免公开它们。事实上,他们可以有效地处理原语,这对他们来说是一个明确的优势……(IterableDon不必费心直接支持数组/varargs;用户总是可以“导入静态java.util.Arrays.asList”,以获得一种非常简单的方法,将varargs转换为集合。这有点离题,但为什么publicstaticarraylist过滤器(T…args,booleanstest谓词)
给出一个缺少的)
错误?因为varargs参数(如果存在)必须是方法签名中的最后一个参数。编译器抱怨在“T…”之后没有看到“')。。。阿格斯
public static <T> List<T> filter(T[] source, BooleanTest predicate)
{
return filter(Arrays.asList(source), predicate);
}