Java 8 forEach 遍历
这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。
从 Java 8 开始,可以使用 forEach
来遍历 List
、Map
、Set
和 Stream
。forEach
使用了函数接口进行实现,如果想对 forEach
的原理有所了解,可以浏览函数接口相关文章。
1. List forEach 遍历
示例1: List
遍历的正常方式。
public static void main(String[] args) {
List<String> list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
for (String s : list) {
System.out.println(s);
}
}
输出结果:
java
nodejs
c++
wdbyte.com
示例2:Java 8 中使用 forEach
遍历 List
。
public static void main(String[] args) {
List<String> list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
// 方法引用
list.forEach(System.out::println);
System.out.println("-------------");
// lambda
list.forEach(s -> System.out.println(s));
}
输出结果:
java
nodejs
c++
wdbyte.com
-------------
java
nodejs
c++
wdbyte.com
2. Map forEach 遍历
示例1: Map
的正常遍历方式。
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
public class Java8ForEachMapNormal {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("java", "JAVA");
hashMap.put("nodejs", "NODEJS");
hashMap.put("c++", "C++");
hashMap.put("wdbyte", "WDBYTE.COM");
hashMap.put(null, "OTHER");
for (Entry<String, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + ":\t" + entry.getValue());
}
}
}
输出结果:
null: OTHER
c++: C++
java: JAVA
wdbyte: WDBYTE.COM
nodejs: NODEJS
示例2:Java 8 中使用 forEach
遍历 Map
。
import java.util.HashMap;
import java.util.Map.Entry;
public class Java8ForEachMap {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("java", "JAVA");
hashMap.put("nodejs", "NODEJS");
hashMap.put("c++", "C++");
hashMap.put("wdbyte", "WDBYTE.COM");
hashMap.put(null, "OTHER");
hashMap.forEach((k, v) -> System.out.println(k + ":\t" + v));
}
}
输出结果:
null: OTHER
c++: C++
java: JAVA
wdbyte: WDBYTE.COM
nodejs: NODEJS
示例3:使用 Java 8 中 forEach
遍历 Map
时,过滤 key 为 NULL
的数据。
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("java", "JAVA");
hashMap.put("nodejs", "NODEJS");
hashMap.put("c++", "C++");
hashMap.put("wdbyte", "WDBYTE.COM");
hashMap.put(null, "OTHER");
hashMap.forEach((k, v) -> {
if (k != null) {
System.out.println(k + ":\t" + v);
}
});
}
输出结果:
c++: C++
java: JAVA
wdbyte: WDBYTE.COM
nodejs: NODEJS
3. Array forEach 遍历
数组 Array
的 forEach
遍历和 List
以及 Map
有些不同,需要先把 Array
转换成支持 forEach
的 Stream
。
示例1:Java 8 中使用 forEach
数组 Array
。
String[] array = {"java", "nodejs", "wdbyte.com"};
Arrays.stream(array).forEach(System.out::println);
输出结果:
java
nodejs
wdbyte.com
4. forEachOrdered 有序遍历
Stream
流中的 forEach
方法,并不能保证元素遍历的有序性,如果是 parallel()
并行访问,遍历结果顺序会被显而易见的打乱。
示例1:forEach
在 parallel()
遍历时,结果顺序会被打乱。
Stream<String> stream = Stream.of("java", "nodejs", "c++", "wdbyte.com");
stream.parallel().forEach(System.out::println);
输出结果:
c++
java
nodejs
wdbyte.com
使用 forEachOrdered
可以保证遍历的有序。
Stream<String> stream = Stream.of("java", "nodejs", "c++", "wdbyte.com");
stream.parallel().forEachOrdered(System.out::println);
输出结果:
java
nodejs
c++
wdbyte.com
5. forEach 和 Consumer
查看 List
和 Stream
的 forEach
方法,发现它们都是接受一个 Consumer<? super T>
类型参数。
示例1:List
的 forEach
方法源码。
// List forEach source code
public interface Iterable<T> {
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
示例2:Stream
的 forEach
方法源码。
public interface Stream<T> extends BaseStream<T, Stream<T>> {
void forEach(Consumer<? super T> action);
}
示例3:创建一个 Consumer
,把传入的字符串转换成大写形式并进行输出,Consumer
适用于 List
和 Stream
的 forEach
。
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class Java8ForEachDiyConsumer {
public static void main(String[] args) {
Stream<String> stream = Stream.of("java", "nodejs", "wdbyte.com");
List<String> list = Arrays.asList("java", "nodejs", "wdbyte.com");
Consumer<String> consumer = (s -> {
String upperCase = s.toUpperCase();
System.out.println(upperCase);
});
list.forEach(consumer);
stream.forEach(consumer);
}
}
输出结果:
JAVA
NODEJS
WDBYTE.COM
JAVA
NODEJS
WDBYTE.COM