6

インターフェイスのみListを実装している場合でも、配列、リスト、セット、およびマップはすべて反復可能なオブジェクトであり、foreachループを介してすべてを使用できると思います。SetIterable

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少し異なるかもしれませんが、Key-Valueリスト(実際の内容)と見なしてみましょう。

その繰り返しの理解から始めて、私は次の方法でタイプを逃していますか?

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オブジェクトを渡すだけです。

例えば:

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();
   }
}
于 2012-05-29T15:04:05.417 に答える
6

Iterableインターフェースと配列を実装するクラスのみがあります。マップはIterableを実装していません。代わりに、3つの異なるIterableビュー(キーセット、値の収集、およびエントリセット)を提供し、それらを繰り返し処理できます。したがって、より完全なチェックは次のようになります。

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

IterableインターフェースのJDK1.7ドキュメントには、iterableを実装するJDK API内のすべてがリストされていますが、サードパーティのライブラリがどのクラスにもIterableを実装することを妨げるものはありません。

于 2012-05-29T15:05:37.040 に答える
1

Iterablesとは別に、配列(Iterableインターフェイスを実装していない)も拡張forループで使用できます。

于 2012-05-29T15:09:51.457 に答える