Java 8 forEach 遍历

这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。

从 Java 8 开始,可以使用 forEach 来遍历 ListMapSetStreamforEach 使用了函数接口进行实现,如果想对 forEach 的原理有所了解,可以浏览函数接口相关文章。

1. List forEach 遍历

示例1List 遍历的正常方式。

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 遍历

示例1Map 的正常遍历方式。

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 遍历

数组 ArrayforEach 遍历和 List 以及 Map 有些不同,需要先把 Array 转换成支持 forEachStream

示例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() 并行访问,遍历结果顺序会被显而易见的打乱。

示例1forEachparallel() 遍历时,结果顺序会被打乱。

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

查看 ListStreamforEach 方法,发现它们都是接受一个 Consumer<? super T> 类型参数。

示例1ListforEach 方法源码。

// 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);
	    }
	}
}

示例2StreamforEach 方法源码。

public interface Stream<T> extends BaseStream<T, Stream<T>> {
	void forEach(Consumer<? super T> action);
}

示例3:创建一个 Consumer,把传入的字符串转换成大写形式并进行输出,Consumer 适用于 ListStreamforEach

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

参考