Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 外部迭代器与内部迭代器_Java_Iterator - Fatal编程技术网

Java 外部迭代器与内部迭代器

Java 外部迭代器与内部迭代器,java,iterator,Java,Iterator,什么是Java中的外部和内部迭代器?它是关于谁的 其他细节在这个问题中我发现: 外部迭代器与内部迭代器 外部迭代器-当迭代由集合对象控制时,我们说我们有一个外部迭代器 在.net或java等语言中,创建外部迭代器非常容易。在我们的经典实现中,实现了一个外部迭代器。在以下示例中,使用了外部迭代器: // using iterators for a clloection of String objects: // using in a for loop for (Iterator it = opti

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

它是关于谁的

其他细节在这个问题中

我发现:

外部迭代器与内部迭代器

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

在.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
设计模式

外部迭代器 当您得到一个迭代器并跨过它时,这是一个外部迭代器

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;
  }
});
内部迭代器 当您将函数对象传递给方法以在列表上运行时,这是一个内部迭代器

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

外部迭代器:-使用它,我们必须一个接一个地迭代所有元素并执行一些操作,因为程序员确实可以控制它,它是一个外部迭代器

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

让我们看看下面的一个例子: 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);
    }

}
我找到了答案

内部迭代器在后台管理迭代。这使得程序员只需声明性地对集合元素进行编码,而不是管理迭代并确保逐个处理所有元素。 例:

公共类内部迭代器{
公共静态void main(字符串参数[]){
List namesList=Arrays.asList(“汤姆”、“迪克”、“哈里”);
namesList.forEach(name->System.out.println(name));//内部迭代
}
}
外部迭代器负责迭代元素,并确保此迭代考虑了记录的总数,是否有更多的记录需要迭代等等,这些都由程序员负责

例:

import java.util.*;
公共类外部迭代器{
公共静态void main(字符串参数[]){
List namesList=Arrays.asList(“汤姆”、“迪克”、“哈里”);
用于(字符串名称:名称列表){
System.out.println(名称);
}
}
}

外部迭代器示例:

int count = 0;
Iterator<SomeStaff> iterator = allTheStaffs.iterator();
while(iterator.hasNext()) {
    SomeStaff staff = iterator.next();
    if(staff.getSalary() > 25) {
        count++;
    }
}
在图像中:


因为Java 5是使用外部迭代器的首选方式,所以应该使用for-each循环:for(Object o:var){//NOOP},尽管它只是显式迭代器使用版本的语法糖分。@JohannZacharee不认为foreach循环是内部迭代器,因为我们无法控制迭代器?@denis631 Yes,我同意foreach循环的行为类似于内部迭代器。我没有使用它作为示例,因为我的理解是Java在编译时将它们转换为外部迭代器。我选择了一个函数示例来更清楚地说明这些差异。我必须通知您,这个问题现在是google上关于“internal external iterator”的第二个结果,摘录为“快速google搜索可能会给您答案:…”,没有一个答案包括删除google搜索链接,重新格式化,希望谷歌结果现在能在摘录的非常好的图片中包含相关内容!
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();