Что такое внешний и внутренний итератор в Java?
Внешний итератор против внутреннего итератора
Ответ 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
.
Ответ 3
Речь идет о том, кто управляет итерацией.
Другие вопросы в этом вопросе Каковы преимущества интерфейса Iterator в Java?
Ответ 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();
В изображениях:
Ответ 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