什么是 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 中,可以将方法作为委托发送。在javaFunctor
中必须使用设计模式。主要思想是创建一个只有一种方法(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 接口有什么好处?
我在这里找到了答案。
内部迭代器在后台管理迭代。这使得程序员只需要以声明方式对 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);
}
}
}
外部迭代器:-使用它我们必须一个接一个地迭代所有元素并执行一些操作,因为程序员确实可以控制它,它是一个外部迭代器。
内部迭代器:-使用它我们可以根据我们的条件进行迭代,程序员可以控制它,它是一个内部迭代器。
让我们看看下面的一个例子: 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