java - 迭代 Collection 或数组对象的常见方法

标签 java

对于下面的代码:

if (Collection.class.isAssignableFrom(object)) {
  int index = 0;
  for (Object item : (Collection) object) {
    doWork(index);
  }
} else if (object.getClass().isArray()) {
  int index = 0;
  for (Object item : (Object[]) object) {
    doWork(index);
  }
} else {
    // do something else
}

是否有一种简洁的方法将两个 block 组合在一起,这样我只需要一个 if block 来处理 Collection 和数组?我拥有 if-block else-if-block 的唯一原因是因为我必须将 object 转换为 CollectionObject[] 取决于其类型。

最佳答案

不是内置的。编译器为增强的 for 发出不同的代码处理 Iterable 时循环与处理数组相比。

要么

  1. 复制循环(当然,循环的内容不需要复制;使用问题中所示的方法),或者
  2. 包裹 Object[]List<Object> ,例如通过 Arrays.asList ,或
  3. 创建您自己的Iterable Object[] 的包装(与关联的 Iterator )。 (不是特别困难,Iterable只有一种非默认方法,Iterator只有两种。)

这是#2 的示例:

Collection<Object> objectCollection = null;
if (Collection.class.isAssignableFrom(object.getClass())) {
    objectCollection = (Collection<Object>) object;
} else if (object.getClass().isArray()) {
    objectCollection = Arrays.asList((Object[]) object);
} else {
    // do something else
}
if (objectCollection != null) {
    int index = 0;
    for (Object item : objectCollection) {
        doWork(index); // See note on question, slightly odd not using `item` here
                       // and not incrementing index in loop
    }
}

旁注:您失踪了.getClass()if (Collection.class.isAssignableFrom(object.getClass())) { .

关于java - 迭代 Collection 或数组对象的常见方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443706/

相关文章:

java - 单元测试环境中的 Log4j

Java多线程代码错误

java - Jersey/* servlet 映射导致静态资源出现 404 错误

java - CompareTo 和 TreeSet 的问题

java - 如何在我的 MainActivity 中获取 EditTextPreference 的引用?

java - 重命名一个项目应该这么难吗?

java - 如何在多个私有(private)连接位置更快地构建依赖项

java - Oozie 不断将旧版本的 httpcore jar 添加到类路径

java - Spring RESTful webservice Hibernate/JPA Crudrepository - 按电影标题获取用户

java - OS如何清理JVM的内存以及JVM如何清理堆中的对象?