数组,列表,集合和映射是可迭代的。还有什么?

时间:2012-05-29 15:03:10

标签: java for-loop foreach iterator

即使只有ListSet实现了接口Iterable,我相信数组,列表,集合和地图都是可迭代的对象,因为我们可以通过foreach循环使用它们:

for(String s : new String[0]);
for(String s : new ArrayList<String>());
for(String s : new HashSet<String>());
for(Entry<Integer, String> entry : new HashMap<Integer, String>().entrySet());

Map的情况可能有点不同,但我们将其视为键值列表(实际上是什么)。

可迭代理解开始,我是否在以下方法中缺少类型?

public boolean isIterable(Object o) {
    return o instanceof Object[] || o instanceof Iterable || o instanceof Map;
}

换句话说,是否还有其他类型可以通过foreach循环进行迭代?

支持但产生的问题:这类型列表是否详尽无遗?

4 个答案:

答案 0 :(得分:15)

任何实现Iterable<T>接口的东西都是可迭代的。 Iterable API列出了许多执行此操作的核心Java类。请注意,这还包括您创建的实现接口的类。如果我的类包含一个ArrayList或其他可迭代对象,我有时会这样做,我想方便地遍历这个内容。我只是将列表的Iterator对象作为iterator()方法的返回结果传递。

例如:

Person.java

class Person {
   private String lastName;
   private String firstName;
   public Person(String lastName, String firstName) {
      this.lastName = lastName;
      this.firstName = firstName;
   }
   @Override
   public String toString() {
      return "Person [lastName=" + lastName + ", firstName=" + firstName + "]";
   }


}

MyPeople.java

class MyPeople implements Iterable<Person> {
   List<Person> personList = new ArrayList<Person>();

   // ... other methods and constructor

   @Override
   public Iterator<Person> iterator() {
      return personList.iterator();
   }
}

答案 1 :(得分:5)

只有实现Iterable接口和数组的类才有。映射不实现Iterable,而是提供三个不同的可迭代视图(键集,值集合和条目集),您可以迭代它们。因此,更完整的检查将是:

return obj instanceof Iterable || obj.getClass().isArray();

答案 2 :(得分:3)

Iterable接口中的JDK 1.7文档列出了实现可迭代的JDK API中的所有内容,但没有任何内容阻止第三方库在任何类中实现Iterable。

答案 3 :(得分:1)

除Iterables外,还可以在增强型for循环中使用数组(不实现Iterable接口)。