Java の外部イテレータと内部イテレータとは何ですか?
6 に答える
外部反復子
イテレータを取得してそれをステップオーバーすると、それは外部イテレータです
for (Iterator iter = var.iterator(); iter.hasNext(); ) {
Object obj = iter.next();
// Operate on obj
}
内部反復子
関数オブジェクトをメソッドに渡してリストを実行する場合、それは内部反復子です
var.each( new Functor() {
public void operate(Object arg) {
arg *= 2;
}
});
この説明を見つけました:
外部イテレータと内部イテレータ。
外部反復子 - 反復がコレクション オブジェクトによって制御される場合、外部反復子があると言います。
.net や Java などの言語では、外部反復子を作成するのは非常に簡単です。私たちの古典的な実装では、外部反復子が実装されています。次の例では、外部反復子が使用されています。
// using iterators for a clloection of String objects:
// using in a for loop
for (Iterator it = options.iterator(); it.hasNext(); ) {
String name = (String)it.next();
System.out.println(name);
}
// using in while loop
Iterator name = options.iterator();
while (name.hasNext() ){
System.out.println(name.next() );
}
// using in a for-each loop (syntax available from java 1.5 and above)
for (Object item : options)
System.out.println(((String)item));
内部イテレータ - イテレータがそれを制御する場合、内部イテレータがあります
一方、内部反復子の実装と使用は非常に困難です。内部反復子が使用されている場合、実行されるコードが集約オブジェクトに委譲されていることを意味します。たとえば、これをサポートする言語では、内部イテレータを簡単に呼び出すことができます。
collection do: [:each | each doSomething] (Smalltalk)
主なアイデアは、実行するコードをコレクションに渡すことです。次に、コレクションは各コンポーネントの doSomething メソッドを内部的に呼び出します。C++ では、doMethod メソッドをポインターとして送信できます。C#、.NET、または VB.NET では、メソッドをデリゲートとして送信できます。Java では、Functor
デザイン パターンを使用する必要があります。主なアイデアは、1 つのメソッド (doSomething) のみで基本インターフェイスを作成することです。次に、インターフェイスを実装するクラスにメソッドが実装され、そのクラスがコレクションに渡されて反復されます。詳細については、Functor
デザイン パターンを参照してください。
外部イテレータの例:
int count = 0;
Iterator<SomeStaff> iterator = allTheStaffs.iterator();
while(iterator.hasNext()) {
SomeStaff staff = iterator.next();
if(staff.getSalary() > 25) {
count++;
}
}
内部反復子の例:
long count = allTheStaffs.stream()
.filter(staff -> staff.getSalary() > 25)
.count();
画像:
誰が反復を制御するかについてです
その他の詳細はこの質問にあります Java の Iterator インターフェイスの利点は何ですか?