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

标签 java iterator foreach

假设我有一个方法接受数组并使用 Java 内置的 for-each loop 处理其中的每个元素,像这样:

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

这工作得很好,但现在我希望能够将相同的方法传递给 List<SomeClass>反而。我注定要使用 Collection.toArray(T []) ,或者是否有我可以用于 myFun() 的参数接受可以在 for-each 构造中使用的任何类型?

澄清一下:我想要一个可以接受任何可迭代对象的方法签名,无论是原始数组还是集合。我可以非常轻松地编写两个方法,一个包装另一个,但我只是想知道是否有更好的方法。

最佳答案

我建议使用IterableCollectionList 作为参数类型。

IMO,集合应该优先于引用数组。如果您碰巧有一个数组 Arrays.asList 可以很好地进行转换。 Arrays.asList 允许 gets 和 sets 回到数组,但显然不是会改变数组长度的“结构”修改。

myFun(Arrays.asList(arr));

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

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

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

关于java - 有没有我可以在 Java 中使用的参数,它适用于所有 for-each 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769510/

相关文章:

C++:二叉搜索树 end() 迭代器

Ruby 循环样式/约定

java - 如何解决 Kotlin 多平台库项目中的 lambda/SAM 问题?

java - 可以在Dart/Flutter中使用HttpRequestBase吗?

java - 为什么java中Collections的fill(),copy(),reverse(),shuffle()是这样实现的

java - 使用foreach循环构造数组中的对象

java - 使用 java 流根据特定检查更新对象

swift 4 : Type of expression is ambiguous without more context inside loop

java - 从Java编译maven项目

java - 在 Tomcat 中的上下文之间共享 session 数据