外部迭代器与内部迭代器

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

外部迭代器

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

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

它是关于谁控制迭代 。

此问题中的其他详细信息Java中的Iterator接口有哪些优点?

外部迭代器 : – 使用这个我们必须逐个迭代所有元素并执行一些操作,因为程序员确实对它有一个控制,它是一个外部迭代器。

内部迭代器 : – 使用这个我们可以根据我们的条件进行迭代,程序员可以控制它,它是一个内部迭代器。

让我们看下面的一个例子: 问:我们想要从列表中添加等于或大于5的整数。

 package java8; import java.util.ArrayList; import java.util.List; public class IteratorExpr { public static void main(String[] args) { List myList = new ArrayList(); 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 

我在这里找到了答案。

内部迭代器在后台管理迭代。 这使得程序员只需要声明性地编写要对Collection的元素执行的操作,而不是管理迭代并确保所有元素一个接一个地处理。 例如:

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