Java 8 中forEach()方法使用详解

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(326)   2023-06-26 07:54:18

Java forEach() 方法是一个实用函数,用于迭代集合,例如(List、Collect或Map)和 Stream。它用于对集合中的每个元素执行给定的操作。

forEach() 方法已添加到以下位置:

  • Iterable 接口 – 这使得 Iterable.forEach() 方法可用于除 Map 之外的所有集合类
  • Map 接口 – 这使得 forEach() 操作可用于所有Map类。
  • Stream 接口 – 这使得 forEach()forEachOrdered() 操作可用于所有类型的流.

1. 可迭代的 forEach()

1.1. forEach() 方法

给定的代码片段显示了 Iterable 接口中的 .Consumer-">forEach() 方法。

它在内部使用 增强的 for 循环。因此,使用新的 for 循环将提供与 forEach() 方法相同的效果和性能。

default void forEach(Consumer<? super T> action) 
{
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

forEach() 方法为 Iterable 的每个元素执行给定的 action,直到所有元素都已处理或 action 抛出异常。

示例 1:使用 forEach() 迭代列表的 Java 程序

List<String> names = Arrays.asList("Alex", "Brian", "Charles");
	
names.forEach(System.out::println);

程序输出:

Alex
Brian
Charles

1.2.创造消费者行动

在上面的示例中,action 表示接受单个输入参数并且不返回任何结果的操作。它是 Consumer 接口的一个实例。

通过像这样创建消费者操作,我们可以指定多个语句,以类似于方法的语法执行。

List<String> names = Arrays.asList("Alex", "Brian", "Charles");

Consumer<String> makeUpperCase = new Consumer<String>()
{
    @Override
    public void accept(String t) 
    {
    	System.out.println(t.toUpperCase());
    }
};

names.forEach(makeUpperCase);	

程序输出:

ALEX
BRIAN
CHARLES

2. Map forEach()

2.1. forEach() 方法

此方法为每个 执行给定的 BiConsumer 操作此 Map 中的条目,直到处理完所有条目或操作引发异常。

default void forEach(BiConsumer<? super K, ? super V> action) {
    Objects.requireNonNull(action);
    for (Map.Entry<K, V> entry : entrySet()) {
        K k;
        V v;
        try {
            k = entry.getKey();
            v = entry.getValue();
        } catch(IllegalStateException ise) {
            // this usually means the entry is no longer in the map.
            throw new ConcurrentModificationException(ise);
        }
        action.accept(k, v);
    }
}

示例 2:使用 forEach() 遍历 Map 的 Java 程序

Map<String, String> map = new HashMap<String, String>();

map.put("A", "Alex");
map.put("B", "Brian");
map.put("C", "Charles");

map.forEach((k, v) -> 
	System.out.println("Key = " + k + ", Value = " + v));

程序输出:

Key = A, Value = Alex
Key = B, Value = Brian
Key = C, Value = Charles

我们还可以创建一个自定义 BiConsumer 操作,它将从 Map 中获取键值对,并一次处理一个条目。

BiConsumer<String, Integer> action = (a, b) -> 
{ 
	//Process the entry here as per business
    System.out.println("Key is : " + a); 
    System.out.println("Value is : " + b); 
}; 

Map<String, Integer> map = new HashMap<>();
    
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

map.forEach(action);

程序输出。

Key is : A
Value is : 1

Key is : B
Value is : 2

Key is : C
Value is : 3

3. 流 forEach() 和 forEachOrdered()

Stream中,forEach()forEachOrdered()是终端操作。

Iterable 类似,流 forEach() 方法对流的每个元素执行一个操作。

对于顺序流,元素的顺序(在迭代期间)与流源中的顺序相同,因此无论我们使用 forEach() 还是 <代码>forEachOrdered()

在使用并行流 时,如果元素的顺序在迭代期间很重要,请使用forEachOrdered()forEach() 方法不保证元素排序以提供并行性的优势。

示例 3:用于迭代 Stream 的 Java forEach() 示例

在此示例中,我们打印数字流中的所有偶数。

List<Integer> numberList = Arrays.asList(1,2,3,4,5);
    
Consumer<Integer> action = System.out::println;

numberList.stream()
	.filter(n -> n%2  == 0)
	.forEach( action );

程序输出。

2
4

示例 4:用于迭代 Stream 的 Java forEachOrdered() 示例

在此示例中,我们打印数字流中的所有偶数。

List<Integer> numberList = Arrays.asList(1,2,3,4,5);
    
Consumer<Integer> action = System.out::println;

numberList.stream()
	.filter(n -> n%2  == 0)
	.parallel()
	.forEachOrdered( action );

程序输出。

2
4

学习快乐!!

地址:https://www.cundage.com/article/foreach-method-example.html

相关阅读

在 Java 8 中,我们可以使用 class::methodName 类型语法。让我们了解不同类型的可用Java 8 中的方法引用。 1. 方法引用的类型 Java 8 允许四种类型的方法引用...
学习使用 Java 8 中的 Collectors.joining() API 使用分隔符/定界符连接字符串流。 1. collectors.joining() 方法 Java Collecto...
让我们看看如何在 Java 8 中将字符串转换为日期。 1)将字符串转换为ISO8601格式的日期 默认情况下,Java 日期采用 ISO8601 格式,因此如果您有任何表示 ISO8601 格...
开发者社区的很大一部分一直在抱怨日期和日历类。原因有很多,例如难以理解、难以使用和不灵活。日期类甚至已经过时,Java 文档建议使用 Calendar 类而不是 Date 类。最重要的是,日期比...
为了向遗留的 Java 8 服务器工作负载提供 Java 17 级别的性能,甲骨文本周推出了 Java SE 订阅企业性能包,为仍然流行的 Java 8 带来了现代垃圾收集算法和其他近期优势。 ...
学习验证给定字符串是否包含日期值。我们将学习 Java 7、Java 8 及更高版本中可用的各种日期验证 技术。 1. LocalDate 和 DateTimeFormatter(Java 8 ...
Java forEach() 方法是一个实用函数,用于迭代集合,例如(List、Collect或Map)和 Stream。它用于对集合中的每个元素执行给定的操作。 forEach() 方法已添加...
这篇文章演示了如何在 Java 8 之前的项目中使用 JUnit 5,并解释了为什么它是一个好主意。 JUnit 5 至少需要 Java 8 作为运行环境,所以你想将你的整个项目更新到 Java...
在上一篇文章中,我们了解了Lambda 表达式和函数式接口/强&gtl;.现在,让我们继续讨论并讨论另一个相关特性,即默认方法。好吧,这对 Java 开发人员来说确实是革命性的。直到 Java ...
学习在 Java 中比较两个给定日期,以找出 在通用时间轴中哪个日期早,哪个日期晚。我们将看到使用以下类的日期比较示例: LocalDate、LocalDateTime 和 ZonedDateT...