外部迭代器与内部迭代器

时间:2008-10-22 06:21:18

标签: java iterator

Java中的外部和内部迭代器是什么?

6 个答案:

答案 0 :(得分:23)

外部迭代器

当你得到一个迭代器并跳过它时,那就是一个外部迭代器

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;
  }
});

答案 1 :(得分:11)

我发现了description

外部与内部迭代器。

外部迭代器 - 当迭代由集合对象控制时,我们说我们有一个外部迭代器。

在.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设计模式。主要思想是仅使用一种方法(doSomething)创建基本接口。然后,该方法将在实现接口的类中实现,并且该类将被传递给集合以进行迭代。有关更多详细信息,请参阅Functor设计模式。

答案 2 :(得分:3)

外部迭代器示例:

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();

在图像中:

enter image description here

答案 3 :(得分:2)

答案 4 :(得分:2)

我在here上找到了答案。

内部迭代器在后台管理迭代。这样,程序员就可以仅声明性地编写对Collection元素要执行的操作,而不是管理迭代并确保所有元素都被一个一个地处理。 例如:

public class InternalIterator {

   public static void main(String args[]){

      List<String> namesList=Arrays.asList("Tom", "Dick", "Harry");

      namesList.forEach(name -> System.out.println(name));//Internal Iteration

   }

}

由外部迭代器负责对元素进行迭代,并确保此迭代考虑了记录的总数,是否存在要迭代的更多记录等等,这取决于程序员。

例如:

import java.util.*;

public class ExternalIterator {

   public static void main(String args[]){
      List<String> namesList=Arrays.asList("Tom", "Dick", "Harry");
      for(String name:namesList){
         System.out.println(name);
      }

   }

}

答案 5 :(得分:0)

外部迭代器:-使用此方法,我们必须一个接一个地迭代所有元素并执行一些操作,因为程序员确实对此具有控制权,即外部迭代器。

内部迭代器:-使用此方法,我们可以根据条件进行迭代,程序员可以对其进行控制,即其内部迭代器。

让我们看下面的一个例子: Q-我们希望将等于或大于5的列表中的整数相加。

package java8;

import java.util.ArrayList;
import java.util.List;

public class IteratorExpr {

    public static void main(String[] args) {
        List<Integer> myList = new ArrayList<Integer>();
        for(int i=0; i<10; i++) myList.add(i);

        //Get sum of all value which is more than 5 using External Iterator
        int sum = 0;
        for(int no: myList) {
            if(no >=5) {
                sum += no;
            }
        }
        System.out.println("Sum of numbers using External api : "+sum);

        int summ = myList.stream()
                .filter(p->p>=5)
                .mapToInt(p->p).sum();
        System.out.println("Sum of numbers using internal api : "+summ);
    }

}

输出:

Sum of numbers using External api : 35
Sum of numbers using internal api : 35