Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我是否使用字符串数组和一个以Iterable作为参数的方法?_Java_Generics_Interface_Functional Programming - Fatal编程技术网

Java 为什么可以';我是否使用字符串数组和一个以Iterable作为参数的方法?

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))

我正试图用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;
}
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);
}