【问题标题】:Java arrays and foreach iteration implementationJava数组和foreach迭代实现
【发布时间】:2011-11-27 06:38:42
【问题描述】:

是否有一些接口允许数组和 java.util.Lists 的迭代?

看到 for-each 循环如何迭代两者,在我看来,在这两种情况下都必须遍历某种基本的“可迭代”。

那么,我可以设置一个接受 Foo[] 或 List 的方法参数吗?

我们有很多旧代码(我们不会更新),它们调用了一些需要数组的低级方法(我想更新)。

我们的新代码正在使用 List 的 toArray 方法从列表(特别是 ArrayLists)转换为数组,我希望能够跳过这一步。

我看过 this 的帖子,其中显示了实现,但我不确定它有什么帮助。

这个可以吗?

【问题讨论】:

标签: java foreach iteration


【解决方案1】:

不,语言规范明确单独调用数组。数组不实现Iterable<T>,这是增强的for循环使用的“普通”接口,而不是数组。来自section 14.14.2 of the JLS

增强的 for 语句具有以下形式:

 EnhancedForStatement:
       for ( VariableModifiers Type Identifier: Expression) Statement

表达式必须要么是Iterable类型,要么是数组类型(§10.1),否则会发生编译时错误。

这两种情况分别处理。

从数组转换为列表当然很容易——但听起来你需要反过来做。确实没有“令人愉快”的方式来做到这一点 - 当然,创建数组需要复制所有内容。

至少将 API 中最常用的位转换为使用列表需要做多少工作?

你当然可以编写方法重载,例如

public void foo(String[] array)
{
    foo(Arrays.asList(array));
}

public void foo(List<String> list)
{
    // Use the list
}

...但是为您的旧代码执行此操作仍然需要工作,因为真正的实现是根据列表,而不是数组。

【讨论】:

  • -谢谢。你知道 Arrays.asList 是否比 List.toArray“便宜”吗?我尝试用谷歌搜索该主题,但尚未看到任何帮助。
  • @rediVider:是的:Arrays.asList 提供了一个支持现有数组的列表,即不涉及复制的视图。 List.toArray 必须复制所有数据。
【解决方案2】:

Java 可以使Foo[] 成为Iterable&lt;Foo&gt; 的子类型;不幸的是,这不适用于原始数组,因为 Java 不支持原始类型参数,所以我们没有这种精细。

【讨论】:

    【解决方案3】:

    我认为数组只是 for 循环实现中的特殊情况。

    你可以做的一件事是重载你的方法:

    public void foo(MyClass[] stuff) {
        foo(Arrays.asList(stuff));
    }
    
    public void foo(Collection<MyClass> stuff) {
        // stuff
    }
    

    或者反过来:

    public void foo(MyClass[] stuff) {
        // stuff
    }
    
    public void foo(Collection<MyClass> stuff) {
        foo(stuff.toArray(new MyClass[stuff.size()]));
    }
    

    【讨论】:

      【解决方案4】:

      没有这样的通用接口,Array 没有实现Iterable

      你可以做的是重载你的方法:

      public void mymethod(String ... strings) {
         mymethod(Arrays.asList(strings));
      }
      
      public void mymethod(List<String> strings) {
         // do what you need
      }
      

      【讨论】:

        猜你喜欢
        • 2016-06-15
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        相关资源
        最近更新 更多