6

即使只List实现Set接口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

4 回答 4

17

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

例如:

人.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 + "]";
   }


}

我的人.java

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

   // ... other methods and constructor

   @Override
   public Iterator<Person> iterator() {
      return personList.iterator();
   }
}
于 2012-05-29T15:04:05.417 回答
6

只有实现 Iterable 接口和数组的类是。Maps 不实现 Iterable,而是提供三种不同的可迭代视图(键集、值集合和条目集),您可以对其进行迭代。因此,更完整的检查将是:

return obj instanceof Iterable || obj.getClass().isArray();
于 2012-05-29T15:13:54.967 回答
3

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

于 2012-05-29T15:05:37.040 回答
1

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

于 2012-05-29T15:09:51.457 回答