Подтвердить что ты не робот

Внешний итератор против внутреннего итератора

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

4b9b3361

Ответ 1

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

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

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

Ответ 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 для каждого из компонентов. В С++ можно отправить метод doMethod в качестве указателя. В С#,.NET или VB.NET можно отправить метод в качестве делегата. В java должен использоваться шаблон дизайна Functor. Основная идея - создать базовый интерфейс только с одним методом (doSomething). Затем метод будет реализован в классе, который реализует интерфейс, и класс будет передан в коллекцию для итерации. Подробнее см. Шаблон дизайна Functor.

Ответ 4

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

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

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

   }

}

Ответ 5

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

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

Ответ 6

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

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

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