一些Java Iterator
和ListIterator
示例。
1.迭代器
1.1从List
或Set
获取Iterator
,并对其进行循环。
JavaIteratorExample1a.java
package com.mkyong;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class JavaIteratorExample1a {
public static void main(String[] args) {
/*
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(5);
Iterator<Integer> iterator = set.iterator();
*/
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer result = iterator.next();
System.out.println(result);
}
}
}
输出量
1
2
3
4
5
1.2 Java 8中,在Iterator
添加了一个新的forEachRemaining
,它提供了Consumer
参数来让我们定义如何使用该项目。
Iterator.java
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
现在,我们可以使用lambda来提供Consumer
功能接口的实现。
JavaIteratorExample1b.java
package com.mkyong;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class JavaIteratorExample1b {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Iterator<Integer> iterator = list.iterator();
// lambda
// iterator.forEachRemaining(x -> System.out.println(x));
// Java 8, method reference
iterator.forEachRemaining(System.out::println);
}
}
输出量
1
2
3
4
5
1.3 forEachRemaining
另一个示例。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Iterator<Integer> iterator = list.iterator();
iterator.forEachRemaining(x -> {
System.out.println(x * 2);
});
输出量
2
4
6
8
10
1.4使用Iterator.remove()
删除元素。
JavaIteratorExample1c.java
package com.mkyong;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class JavaIteratorExample1c {
public static void main(String[] args) {
// immutable list
// List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// mutable list
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
if (next == 3 || next == 4) {
iterator.remove();
}
}
list.forEach(System.out::println);
}
}
输出量
1
2
5
2. ListIterator
此ListIterator
扩展了Iterator
以提供其他功能,例如
- 在
next()
和previous()
任一方向遍历列表 - 在迭代过程中修改列表,
add()
和set()
- 获取迭代器在列表中的当前位置
nextIndex()
和previousIndex()
2.1将List
转换为ListIterator
。
JavaIteratorExample2a.java
package com.mkyong;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
public class JavaIteratorExample2a {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
// get ListIterator, start from list's index 2
ListIterator<String> iterator = list.listIterator(2);
iterator.forEachRemaining(System.out::print); // cde
System.out.println("");
// get ListIterator, start from list's index 0
ListIterator<String> iterator2 = list.listIterator();
iterator2.forEachRemaining(System.out::print); // abcde
}
}
输出量
cde
abcde
2.2沿前后方向遍历列表。
JavaIteratorExample2b.java
package com.mkyong;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
public class JavaIteratorExample2b {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
ListIterator<Integer> iterator = list.listIterator();
// loop to the end
while (iterator.hasNext()) {
Integer next = iterator.next();
System.out.println(next);
}
System.out.println("---");
// now loop back to the begin
while (iterator.hasPrevious()) {
Integer previous = iterator.previous();
System.out.println(previous);
}
}
}
输出量
1
2
3
4
5
---
5
4
3
2
1
2.3使用ListIterator.set()
更新元素
JavaIteratorExample2c.java
package com.mkyong;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class JavaIteratorExample2c {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> iterator = list.listIterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
if (next == 3) {
iterator.set(33);
}
if (next == 4) {
iterator.set(44);
}
}
list.forEach(x -> System.out.println(x));
}
}
输出量
1
2
33 // updated, was 3
44 // updated, was 4
5
2.4使用ListIterator.add()
添加元素
JavaIteratorExample2d.java
package com.mkyong;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class JavaIteratorExample2d {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> iterator = list.listIterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
if (next == 5) {
iterator.add(6);
}
}
list.forEach(x -> System.out.println(x));
}
}
输出量
1
2
3
4
5
6 // new!
2.4获取迭代器的当前位置, previousIndex()
和nextIndex()
JavaIteratorExample2c.java
package com.mkyong;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class JavaIteratorExample2c {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> iterator = list.listIterator();
while (iterator.hasNext()) {
// cursor index, iterator not move yet!
// init = -1 , add 0
if (iterator.previousIndex() < 0) {
iterator.add(0);
}
// move the iterator
iterator.next();
// if this is last index
if (iterator.nextIndex() >= list.size()) {
iterator.add(6);
}
}
list.forEach(x -> System.out.println(x));
}
}
输出量
0
1
2
3
4
5
6
3.将迭代器转换为流
遵循步骤Iterator -> Spliterators -> Stream -> List
JavaIteratorExample3a.java
package com.mkyong;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
public class JavaIteratorExample3a {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator = list.iterator();
// Iterator -> Spliterators -> Stream -> List
List<Integer> result = StreamSupport.stream(
Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.map(x -> x * 2)
.collect(Collectors.toList());
result.forEach(x -> System.out.println(x));
System.out.println(result.getClass());
}
}
输出量
2
4
6
8
10
class java.util.ArrayList