我可以在Java中使用的参数适用于所有for-each循环吗?

Dan*_*Lew 7 java foreach iterator

假设我有一个接受数组并使用Java内置for-each循环处理其中每个元素的方法,如下所示:

public static void myFun(SomeClass[] arr) {
    for (SomeClass sc : arr) {
        // Stuff is processed here
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但现在我希望能够传递相同的方法List<SomeClass>.我注定要使用Collection.toArray(T []),还是我可以使用的参数myFun()接受任何可以在for-each构造中使用的类型?

澄清:我想要一个接受任何可迭代对象的方法签名,无论是原始数组还是Collection.我可以很容易地编写两种方法,一种方法包装另一种方法,但我只是好奇是否有更好的方法.

Tom*_*ine 9

我建议使用Iterable,CollectionList作为参数类型.

IMO,集合应该优先于引用数组.如果你碰巧有一个数组Arrays.asList,转换很好.Arrays.asList允许获取并返回到数组,但显然不是"结构"修改会改变数组长度.

myFun(Arrays.asList(arr));
Run Code Online (Sandbox Code Playgroud)

您可能必须在极端/一般情况下使用通配符.

public static void myFun(Iterable<? extends SomeClass> somethings) {
    for (SomeClass something : somethings) {
        // something is processed here
    }
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是Collections.toArray,Arrays.asList工作略有不同.asList保持原始数组支持集合,因此对集合的更改将反映在数组中.Collections.toArray制作集合数据的(浅)副本.如果要返回数组,那么复制通常是您想要的.不对称,如果您作为参数传递,通常不会复制(除非存储为字段).


Mic*_*ers 5

使用Iterable.这就是它的用途.

正如你所说,Iterable不会处理数组.

您不希望使用多个方法相互包装.这排除了Arrays.asListCollection.toArray.

所以你的问题的答案是否定的,没有办法.但是,如果你可以使用Lists,为什么你会使用数组?

我仍然会在Iterable这里.我比它更喜欢它,Collection因为在过去,我已经有了实施Iterable但没有收藏的课程; 这使他们很容易根据需要懒惰地检索值,我可以在它们上使用foreach循环.

  • 如果使用Iterable作为参数,则在尝试传入原始数组时会出现编译错误. (2认同)