Внешний итератор против внутреннего итератора - PullRequest
28 голосов
/ 22 октября 2008

Что такое внешний и внутренний итератор в Java?

Ответы [ 6 ]

23 голосов
/ 22 октября 2008

Внешний итератор

Когда вы получаете итератор и переступаете через него, это внешний итератор

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;
  }
});
11 голосов
/ 22 октября 2008

Я нашел это описание :

Внешние и внутренние итераторы.

Внешние Итераторы - когда итерацией управляет объект коллекции, мы говорим, что у нас есть внешний Итератор.

В таких языках, как .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.

3 голосов
/ 25 октября 2018

Пример внешнего итератора:

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

2 голосов
/ 12 августа 2018

Я нашел ответ более здесь .

Внутренние Итераторы управляют итерациями в фоновом режиме. Это оставляет программисту просто декларативно кодировать то, что должно быть сделано с элементами Коллекции, вместо того, чтобы управлять итерацией и удостовериться, что все элементы обрабатываются один за другим. Пример:

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

   }

}

С внешними итераторами ответственность за итерацию по элементам и обеспечение того, чтобы эта итерация учитывала общее количество записей, существует ли больше записей для итерации и т. Д., Лежит на программисте.

Ex:

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

   }

}
2 голосов
/ 22 октября 2008

Это о том, кто контролирует итерацию .

Другие подробности в этом вопросе Каковы преимущества интерфейса Iterator в Java?

0 голосов
/ 03 августа 2018

Внешний итератор : - Используя это, мы должны перебрать все элементы один за другим и выполнить некоторую операцию, потому что программист имеет контроль над этим, его внешний итератор.

Внутренний итератор : - Используя это, мы можем выполнять итерацию в соответствии с нашим условием, программист может контролировать его, это внутренний итератор.

Давайте посмотрим на один пример ниже: 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
...