Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

8.7. Iterator 迭代器

Iterator接口包含四个方法:hasNext,next,remove,forEachRemaining

8.7.1. List 迭代

		
package cn.netkiller.test;

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

public class Test {

    public static void main(String[] args) {
        Test test = new Test();

//        ArrayList<String> arrayList = new ArrayList<String>();

        List<String> list = List.of("Neo", "Tom", "Jerry");

        System.out.printf("%s for %s\n", "=".repeat(10), "=".repeat(10));
        for (String name : list) {
            System.out.println(name);
        }
        System.out.printf("%s forEach %s\n", "=".repeat(10), "=".repeat(10));
        list.forEach(obj -> {
            System.out.println(obj);
        });


        Iterator<String> iterator = list.iterator();
        
        System.out.printf("%s while %s\n", "=".repeat(10), "=".repeat(10));
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.printf("%s forEachRemaining %s\n", "=".repeat(10), "=".repeat(10));
        iterator.forEachRemaining(System.out::println);

    }
}		
		
			

8.7.2. 处理剩余结果

			
iterator.forEachRemaining(System.out::println);
			
			

8.7.3. Map 迭代

			
package cn.netkiller.test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Test {

    public static void main(String[] args) {
        System.out.printf("%s Map<Integer, String> %s\n", "=".repeat(10), "=".repeat(10));
        Map<Integer, String> map = new HashMap<Integer, String>();
        for (int i = 0; i < 10; i++) {
            map.put(i, "map" + i);
        }
        Iterator iterMap = map.entrySet().iterator();
        while (iterMap.hasNext()) {
            Map.Entry strMap = (Map.Entry) iterMap.next();
            System.out.println("key: " + strMap.getKey() + ", value: " + strMap.getValue());
        }
    }
}			
			
			

8.7.4. Iterator 与 List 的区别

List 加载后放入内存,可以可以反复使用,Iterator 一旦调用 next() 就会从内存中清除,无法再次引用。

			
package cn.netkiller.test;

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

public class Test {

    public static void main(String[] args) {

        List<String> list = List.of("Neo", "Tom", "Jerry");

        System.out.printf("%s List<String> %s\n", "=".repeat(10), "=".repeat(10));
        list.forEach(System.out::println);

        Iterator<String> iterator = list.iterator();

        System.out.printf("%s next() %s\n", "=".repeat(10), "=".repeat(10));
        String name = iterator.next();
        System.out.println(name);

        System.out.printf("%s forEachRemaining() %s\n", "=".repeat(10), "=".repeat(10));
        iterator.forEachRemaining(System.out::println);

        System.out.printf("%s while hasNext() %s\n", "=".repeat(10), "=".repeat(10));
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

    }
}
			
			

输出结果

			
========== List<String> ==========
Neo
Tom
Jerry
========== next() ==========
Neo
========== forEachRemaining() ==========
Tom
Jerry
========== while hasNext() ==========
			
			

8.7.5. remove() 删除操作

			
package cn.netkiller.test;

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

public class Test {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>(List.of("Neo", "Tom", "Jerry"));

        System.out.printf("%s List<String> %s\n", "=".repeat(10), "=".repeat(10));
        list.forEach(System.out::println);
        Iterator<String> iterator = list.iterator();

        System.out.printf("%s remove() %s\n", "=".repeat(10), "=".repeat(10));
        while (iterator.hasNext()) {
            String name = iterator.next();

            if (name.equals("Tom")) {
                iterator.remove();
            } else {
                System.out.println(name);
            }

        }

    }
}			
			
			

UnsupportedOperationException 异常

			
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
	at java.base/java.util.ImmutableCollections$ListItr.remove(ImmutableCollections.java:387)
	at cn.netkiller.test.Test.main(Test.java:36)			
			
			

List.of 跟 Arrays.asList 不支持 remove() 操作,会抛出 UnsupportedOperationException 异常。

			
List<String> list = List.of("Neo", "Tom", "Jerry");
List<String> list = Arrays.asList("Neo", "Tom", "Jerry");
			
			

8.7.6. Iterable 转 List

			
	Iterable<Entity> iterable = repository.findAll();
	List<Entity> list = new ArrayList<>();
	iterable.forEach(single->{list.add(single);});
 
  	List<String> result = new ArrayList<String>();
    iterable.forEach(result::add);
 
    List<String> result = new ArrayList<String>();
    for (String str : iterable) {
        result.add(str);
    } 			
    
    List<String> result = new ArrayList<String>();
    while (iterator.hasNext()) {
        result.add(iterator.next());
    }
    
	List<String> result = StreamSupport.stream(iterable.spliterator(), false).collect(Collectors.toList());
	List<String> result = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false).collect(Collectors.toList());

    List<String> result = new ArrayList<String>();
    iterator.forEachRemaining(result::add);