首页  >  文章  >  Java  >  了解 Java 流中的终端与中间运算符:主要区别和示例

了解 Java 流中的终端与中间运算符:主要区别和示例

Barbara Streisand
Barbara Streisand原创
2024-10-11 10:11:02601浏览

Understanding Terminal vs Intermediate Operators in Java Streams: Key Differences and Examples

1. Java Streams概述

Java Streams 在 Java 8 中引入,允许对元素序列进行函数式操作。它们提供了一种以更具声明性和可读性的方式处理数据集合的强大方法。

1.1 什么是终端运营商?

终端运算符是标记流管道结束的操作。它们触发流中数据的处理并产生结果或副作用。一旦调用了终端操作符,流就被视为已消耗,并且不能对其执行进一步的操作。

终端运营商常见示例:

  • forEach():迭代每个元素并执行操作。
  • collect():将流中的元素收集到集合或其他形式。
  • reduce():将流的元素组合成单个结果。
  • count():计算流中元素的数量。

示例代码:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class TerminalOperatorExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // Terminal operator: forEach
        names.stream().forEach(name -> System.out.println("Name: " + name));

        // Terminal operator: collect
        List<String> filteredNames = names.stream()
                                           .filter(name -> name.startsWith("A"))
                                           .collect(Collectors.toList());
        System.out.println("Filtered Names: " + filteredNames);
    }
}

演示结果:

Name: Alice
Name: Bob
Name: Charlie
Filtered Names: [Alice]

1.2 什么是中间算子?

中间运算符是将一个流转换为另一个流的操作。在调用终端操作员之前,它们不会触发任何处理。这些运算符用于构建操作管道,从而实现高效的数据处理和操作。

中间运算符的常见示例:

  • filter():根据谓词过滤元素。
  • map():使用函数转换每个元素。
  • sorted():根据比较器对元素进行排序。
  • distinct():删除重复元素。

示例代码:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class IntermediateOperatorExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Alice");

        // Intermediate operators: filter and map
        List<String> transformedNames = names.stream()
                                              .filter(name -> name.startsWith("A"))
                                              .map(String::toUpperCase)
                                              .distinct()
                                              .collect(Collectors.toList());
        System.out.println("Transformed Names: " + transformedNames);
    }
}

演示结果:

Transformed Names: [ALICE]

2. 终端运营商和中间运营商之间的主要区别

了解这些运算符之间的差异对于有效的流处理至关重要。

2.1 目的和功能

  • 终端操作符:结束流管道,触发处理,并产生结果或副作用。它们旨在执行操作并从流中生成输出。
  • 中间运算符:将流转换为另一个流,而不对数据进行任何处理。它们用于创建操作管道,一旦调用终端操作符就会执行这些操作。

2.2 执行与性能

  • 终端操作符:导致整个流管道的处理。它们仅执行一次,并且根据操作的不同,计算成本可能会很高。
  • 中间运算符:是惰性的,在调用终端运算符之前不执行任何处理。这允许高效的操作链接,而无需不必要的计算。

2.3 可变性和状态

  • 终端操作符:可能会产生副作用或修改外部状态。例如,forEach() 可以将元素打印到控制台或更新外部集合。
  • 中间运算符:无状态,不修改外部状态。它们仅处理流中的数据并生成新的流作为输出。

三、结论

了解 Java Streams 中的终端和中间运算符对于编写高效且可读的代码至关重要。终端算子完成流处理管道,而中间算子构建和转换管道。通过有效地利用这些运算符,您可以以更具声明性和功能性的方式处理数据处理任务。

如果您有任何疑问或需要进一步说明,请随时在下面评论!

阅读更多文章:了解 Java 流中的终端与中间运算符:主要差异和示例

以上是了解 Java 流中的终端与中间运算符:主要区别和示例的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn