未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • Java 新特性

  • Java8 新特性

    • Java 8 Lambda 和 Comparator 排序
    • Java 8 Optional 介绍
    • Java 8 Lambda 表达式介绍
    • Java 8 Stream 流式操作
    • Java 8 LocalDate、LocalDateTime 时间处理介绍
    • Java 8 List 转 Map
    • Java 8 Function 函数接口
    • Java 8 Supplier 函数接口
    • Java 8 Consumer 函数接口
    • Java 8 Predicate 函数接口
    • Java 8 forEach 遍历
      • 1. List forEach 遍历
      • 2. Map forEach 遍历
      • 3. Array forEach 遍历
      • 4. forEachOrdered 有序遍历
      • 5. forEach 和 Consumer
      • 参考
    • Java 8 BiFunction 函数接口
    • Java 8 BiPredicate 函数接口
    • Java 8 UnaryOperator 函数接口
  • Java 新特性
  • Java8 新特性
程序猿阿朗
2021-07-18

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);
    }
}
1
2
3
4
5
6

输出结果:

java
nodejs
c++
wdbyte.com
1
2
3
4

示例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));
}
1
2
3
4
5
6
7
8

输出结果:

java
nodejs
c++
wdbyte.com
-------------
java
nodejs
c++
wdbyte.com
1
2
3
4
5
6
7
8
9

# 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());
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

输出结果:

null:	OTHER
c++:	C++
java:	JAVA
wdbyte:	WDBYTE.COM
nodejs:	NODEJS
1
2
3
4
5

示例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));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

输出结果:

null:	OTHER
c++:	C++
java:	JAVA
wdbyte:	WDBYTE.COM
nodejs:	NODEJS
1
2
3
4
5

示例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);
        }
    });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

输出结果:

c++:	C++
java:	JAVA
wdbyte:	WDBYTE.COM
nodejs:	NODEJS
1
2
3
4

# 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);
1
2

输出结果:

java
nodejs
wdbyte.com
1
2
3

# 4. forEachOrdered 有序遍历

Stream 流中的 forEach 方法,并不能保证元素遍历的有序性,如果是 parallel() 并行访问,遍历结果顺序会被显而易见的打乱。

示例1:forEach 在 parallel() 遍历时,结果顺序会被打乱。

Stream<String> stream = Stream.of("java", "nodejs", "c++", "wdbyte.com");
stream.parallel().forEach(System.out::println);
1
2

输出结果:

c++
java
nodejs
wdbyte.com
1
2
3
4

使用 forEachOrdered 可以保证遍历的有序。

Stream<String> stream = Stream.of("java", "nodejs", "c++", "wdbyte.com");
stream.parallel().forEachOrdered(System.out::println);
1
2

输出结果:

java
nodejs
c++
wdbyte.com
1
2
3
4

# 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);
	    }
	}
}
1
2
3
4
5
6
7
8
9

示例2:Stream 的 forEach 方法源码。

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

示例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);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

输出结果:

JAVA
NODEJS
WDBYTE.COM
JAVA
NODEJS
WDBYTE.COM
1
2
3
4
5
6

# 参考

  • Consumer (Java SE 11 & JDK 11 ) (opens new window)
  • Stream forEach Javadoc (opens new window)
  • Iterable forEach Javadoc (opens new window)

订阅

文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

文章作者: 程序猿阿朗
文章链接:https://www.wdbyte.com/java8/java8-foreach/
版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
#Java8#Function Interface#Java8 ForEach
上次更新: 2022/12/05, 08:18:32
Java 8 Predicate 函数接口
Java 8 BiFunction 函数接口

← Java 8 Predicate 函数接口 Java 8 BiFunction 函数接口→

最近更新
01
如何搭建一个自己的音乐服务器
12-04
02
JUnit 5 单元测试教程
11-17
03
使用 StringUtils.split 的坑
11-02
更多文章>

提示:评论前请刷新页面,否则评论的可能不是当前文章。

Theme by Vdoing | Copyright © 2018-2022 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式