39

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

4

6 回答 6

29

外部迭代器

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

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;
  }
});
于 2008-10-22T06:32:24.927 回答
11

我找到了这个描述

外部与内部迭代器。

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

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

于 2008-10-22T06:27:22.453 回答
8

外部迭代器示例:

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

在图像中:

在此处输入图像描述

于 2018-10-25T11:17:12.797 回答
2

这是关于谁控制迭代

其他细节在这个问题中 Java 中的 Iterator 接口有什么好处?

于 2008-10-22T06:25:35.470 回答
1

我在这里找到了答案。

内部迭代器在后台管理迭代。这使得程序员只需要以声明方式对 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);
      }

   }

}
于 2018-08-12T16:58:54.123 回答
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
于 2018-08-03T06:46:15.843 回答