【问题标题】:Why can't I use a String array with a method taking an Iterable as a parameter?为什么我不能将 String 数组与将 Iterable 作为参数的方法一起使用?
【发布时间】:2011-01-03 22:16:30
【问题描述】:

我正在尝试用 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;
}

为什么我不能在这个 sn-p 上使用它:

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 作为第一个参数,我认为我涵盖了所有情况。

【问题讨论】:

  • Iterable&lt;? extends T&gt; source 会更笼统一些。)
  • 不要直接支持数组/可变参数;用户始终可以“导入静态 java.util.Arrays.asList”以获得将可变参数转换为集合的非常简单的方法。

标签: java generics interface functional-programming


【解决方案1】:

不幸的是,数组在 Java 中没有实现任何接口。 enhanced for loop 分别作用于数组可迭代对象。

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

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

【讨论】:

  • 那么,我需要实现两个版本吗?一个采用Iterable,一个采用可变长度参数?
  • 或者首先以Collection 开头。
  • 是的,但如果能够使用数组也很好。
  • Geo,Java Generics and Collections 优秀书籍基本上建议将数组视为已弃用的类型。对于我自己的 API,我总是倾向于避免使用数组。
  • 我不会将数组视为已弃用 - 尽管我会通常避免暴露它们。他们可以有效地处理原语这一事实无疑对他们有利...
【解决方案2】:

我同意,这很烦人。

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

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

【讨论】:

  • 有点离题,但为什么public static &lt;T&gt; ArrayList&lt;T&gt; filter(T... args,BooleanTest predicate) 会给出缺少的) 错误?
  • 因为 varargs 参数(如果存在)必须是方法签名中的最后一个参数。编译器抱怨它在 'T... args' 之后没有看到 ')'
【解决方案3】:

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

我通常的处理方式是:

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

或者:

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

或:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多