Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida Iterator e Iterable

Estou utilizando a interface interable e estou com dúvida na parte do código -> employeeList.iterator(); -> Aqui ele está usando o iterator() da classe que implementa o List ?

public class Employee {
  private String name;
  private Integer age;

  public Employee(String name, Integer age) {
    this.name = name;
    this.age = age;
  }
}
//IterableDepartment.java which implements Iterable<Employee>
package com.javabrahman.corejava;

import java.util.List;
import java.util.Iterator;

public class IterableDepartment implements Iterable<Employee> {

  List<Employee> employeeList;

  public IterableDepartment(List<Employee> employeeList){
    this.employeeList=employeeList;
  }

 @Override
  public Iterator<Employee> iterator() {
    return **employeeList.iterator();**
  }
}
//Client class IterableDeptClient.java
//Iterates through IterableDepartment's employees using for-each loop
package com.javabrahman.corejava;

import java.util.Arrays;
import java.util.List;

public class IterableDeptClient {
  public static void main(String args[]){
    List<Employee> employeeList
        = Arrays.asList(new Employee("Tom Jones", 45),
        new Employee("Harry Jones", 42),
        new Employee("Ethan Hardy", 65),
        new Employee("Nancy Smith", 22),
        new Employee("Deborah Sprightly", 29));

    IterableDepartment iterableDepartment=new IterableDepartment(employeeList);

    for(Employee emp: iterableDepartment){
      System.out.println(emp.getName());
    }
  }
}
6 respostas

Olá Luis,

sim, basicamente o comando employeeList.iterator() chamará o iterator da classe que foi usada para instanciar esta List. Neste código, como foi usado o comando Arrays.asList para criar a lista, é usado o iterator do tipo de lista que este método asList instancia.

Vlw Lucas,

Acabei de acessar a classe Arrays e não tem o método Iterator ? Será que essa classe mesmo que ele chama ?

Na verdade olha o método asList. Ele devolve uma instancia de ArrayList, que é de onde ele chama o método iterator(). Mas cuidado para não confundir, porque não é o ArrayList do java.util. Dentro da classe Arrays tem uma outra classe ArrayList, esta é a classe que ele usa e dentro dela terá o iterator.

Lucas, debuguei o código e ele chamou o Iterator da classe

public abstract class AbstractList extends AbstractCollection implements List

Mas acho que entendi, nesse caso ele está utilizando uma implentação de um iterator já feito correto ?

Se eu quiser criar um iterator próprio, posso criar um classe aninhada e chamo minha class.iterator() certo ?

Muito obrigado pela ajuda!

solução!

Isso, é que a ArrayList deles herda de AbstractList. Por isso que ele usa o iterator de AbstractList.

Bom o que você pode fazer é justamente mexer na implementação do método iterator de IterableDepartment se quiser criar o seu próprio.

Vlw monstro!