知乎专栏 |
Iterator接口包含四个方法:hasNext,next,remove,forEachRemaining
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); } }
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()); } } }
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() ==========
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");
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);