Java 中如何使用 Stream API?

简介: Java 中如何使用 Stream API?

什么是 Stream API?


Stream API 是 Java 8 中引入的一项新特性,它提供了一种函数式的、流式处理集合数据的方式。Stream API 可以让我们以更简洁、更易读的方式处理集合数据,同时还可以充分利用多核 CPU 的并行处理能力,提高程序的执行效率。


在 Stream API 中,我们可以通过一系列的操作对集合数据进行处理,这些操作可以分为中间操作和终止操作。中间操作是对流的数据进行处理和转换,但不会产生最终的结果;终止操作是产生最终结果的操作,它会触发流的处理,并将结果返回。


Stream API 主要包含以下几个部分:


  • 流的创建:通过集合、数组、文件等方式创建流。
  • 操作流:对流进行过滤、映射、排序、去重等操作。
  • 终止流:将流转换为集合、数组、汇总统计、匹配检查等。


下面我们将详细介绍 Java 中如何使用 Stream API。


image.png


Java 中如何使用 Stream API?


流的创建


在 Java 中,我们可以通过多种方式创建流。以下是一些常用的流的创建方式:


从集合创建流

List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream();

从数组创建流

int[] array = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array);

从文件创建流

Path path = Paths.get("file.txt");
Stream<String> stream = Files.lines(path);

从函数创建流

Stream.generate(() -> "hello")
      .limit(5)
      .forEach(System.out::println);

在上面的代码中,我们使用 Stream.generate() 方法创建了一个无限流,该流会不断生成字符串 “hello”,然后使用 limit() 方法对流进行截取,最终输出前 5 个元素。


操作流


在创建了流之后,我们可以对流进行一系列的操作,以实现数据的处理和转换。以下是一些常用的流操作:


filter() 方法


filter() 方法可以对流中的数据进行过滤,只保留符合条件的数据,从而得到一个新的流。


List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));

上面的代码中,我们使用 filter() 方法过滤出以 “a” 开头的字符串,得到一个新的流。


map() 方法


map() 方法可以对流中的数据进行转换,从而得到一个新的流。


List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream().map(String::toUpperCase);

上面的代码中,我们使用 map() 方法将字符串转换成大写形式,得到一个新的流。


sorted() 方法


sorted() 方法可以对流中的数据进行排序,从而得到一个新的流。


List<String> list = Arrays.asList("b", "a", "d", "c");
Stream<String> stream = list.stream().sorted();

上面的代码中,我们使用 sorted() 方法对字符串进行排序,得到一个新的流。


distinct() 方法


distinct() 方法可以对流中的数据进行去重,从而得到一个新的流。


List<String> list = Arrays.asList("a", "b", "a", "c");
Stream<String> stream = list.stream().distinct();

上面的代码中,我们使用 distinct() 方法对字符串进行去重,得到一个新的流。


peek() 方法


peek() 方法可以对流中的数据进行操作,不会改变流中的数据,但可以在操作过程中输出一些信息。

List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream().peek(System.out::println);


上面的代码中,我们使用 peek() 方法对字符串进行操作,并输出字符串的值,但不会改变流中的数据。


终止流


在对流进行了操作之后,我们可以通过终止操作将流转换为最终的结果。以下是一些常用的终止操作:


collect() 方法


collect() 方法可以将流中的元素收集到一个集合中,如 List、Set、Map 等。


List<String> list = Arrays.asList("a", "b", "c", "d");
List<String> result = list.stream().collect(Collectors.toList());

上面的代码中,我们使用 collect() 方法将流中的元素收集到一个 List 中。


reduce() 方法


reduce() 方法可以对流中的元素进行累加、求和等操作,得到一个最终的结果。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, Integer::sum);

上面的代码中,我们使用 reduce() 方法对整数进行求和操作,并得到最终的结果。


count() 方法


count() 方法可以统计流中的元素个数。


List<String> list = Arrays.asList("a", "b", "c", "d");
long count = list.stream().count();

上面的代码中,我们使用 count() 方法统计了流中的元素个数。


forEach() 方法


forEach() 方法可以对流中的每个元素进行操作,如输出到控制台等。


List<String> list = Arrays.asList("a", "b", "c", "d");
list.stream().forEach(System.out::println);

上面的代码中,我们使用 forEach() 方法输出了流中的每个元素。


完整示例代码


下面是一个完整的示例代码,演示了如何使用 Stream API 对集合中的数据进行操作。


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamDemo {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("hello", "world", "java", "stream", "api");
        // 过滤出长度大于 4 的字符串,并将其转换成大写形式
        List<String> result = list.stream()
                .filter(s -> s.length() > 4)
                .map(String::toUpperCase)
                .collect(Collectors.toList());
        System.out.println(result);
        // 统计字符串的个数
        long count = list.stream().count();
        System.out.println(count);
        // 对字符串进行排序,并输出到控制台
        list.stream().sorted().forEach(System.out::println);
        // 对字符串进行去重,并输出到控制台
        list.stream().distinct().forEach(System.out::println);
        // 对字符串进行操作,并输出到控制台
        list.stream().peek(System.out::println).collect(Collectors.toList());
    }
}

以上代码演示了如何使用 Stream API 对集合中的数据进行操作,并输出结果到控制台。


总结


Stream API 是 Java 8 中引入的一项新特性,它提供了一种函数式的、流式处理集合数据的方式。Stream API 可以让我们以更简洁、更易读的方式处理集合数据,同时还可以充分利用多核 CPU 的并行处理能力,提高程序的执行效率。在使用 Stream API 时,我们可以通过一系列的操作对集合数据进行处理,这些操作可以分为中间操作和终止操作。中间操作是对流的数据进行处理和转换,但不会产生最终的结果;终止操作是产生最终结果的操作,它会触发流的处理,并将结果返回。通过使用 Stream API,我们可以更方便地进行集合数据的处理和转换,提高程序的可读性和可维护性。


相关文章
|
3天前
|
Oracle 安全 Java
JAVA用Mail发送API的方法步骤教程
使用Java和Mail发送API实现自动化邮件发送,提高效率。步骤包括:1. 安装JDK并配置JAVA_HOME,2. 添加JavaMail库(可通过Maven或官网下载)。配置邮件发送涉及邮件服务器地址、端口和认证信息。创建邮件会话、邮件消息对象,然后使用Transport发送。示例代码展示完整流程。注意处理认证失败、连接问题和邮件发送失败等常见问题。
|
3天前
|
编解码 前端开发 Java
Java网络API之Netty深度解析
Java网络API之Netty深度解析
11 0
|
3天前
|
Java API
Java 8新特性之Lambda表达式和Stream API
【5月更文挑战第31天】本文将详细介绍Java 8中的两个重要特性:Lambda表达式和Stream API。通过对比传统编程方式,我们将探讨这两个特性如何简化代码、提高可读性和性能。文章还将通过实例演示如何使用Lambda表达式和Stream API进行集合操作、过滤和转换等任务。
|
4天前
|
Java API 数据处理
Java 8中的Stream API简介及其在数据处理中的应用
【5月更文挑战第30天】 本文旨在介绍Java 8中引入的Stream API,它是一种用于处理集合的新方法。与传统的循环和迭代器相比,Stream API提供了一种更简洁、高效的方式来处理数据。文章将详细介绍Stream API的基本概念、常用操作以及在实际项目中的应用场景。
|
4天前
|
Java API
Java 8新特性之Stream API详解
【5月更文挑战第30天】本文将详细介绍Java 8中的一个重要新特性——Stream API。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,使得代码更加简洁、易读。文章将从Stream的基本概念、创建方式、常用操作以及实战案例等方面进行详细讲解,帮助读者深入理解并掌握Stream API的使用。
|
5天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第29天】本文将介绍Java 8中的两个重要特性——Lambda表达式和Stream API。Lambda表达式简化了函数式编程,使得代码更加简洁易读;而Stream API则为集合操作提供了更加高效且易于理解的方法。通过本文的学习,你将掌握这两个特性的基本用法,并了解如何在实际项目中应用它们。
|
存储 搜索推荐 Java
Java8 Stream 数据流,大数据量下的性能效率怎么样?
Stream 是Java SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型:Stream<T> 代表对象引用流,此外还有一系列特化流,如 IntStream,LongStream,DoubleStream等。
Java8 Stream 数据流,大数据量下的性能效率怎么样?
|
算法 IDE Java
Java8 Stream性能如何及评测工具推荐
Java8 Stream性能如何及评测工具推荐
255 0
Java8 Stream性能如何及评测工具推荐
|
Java 测试技术 程序员
牛逼哄洪的 Java 8 Stream,性能也牛逼么?
牛逼哄洪的 Java 8 Stream,性能也牛逼么?
160 0
牛逼哄洪的 Java 8 Stream,性能也牛逼么?
|
3天前
|
Java 开发者 UED
掌握Java多线程编程:从基础到高级
【5月更文挑战第31天】本文深入探讨了Java多线程编程的核心概念,包括线程的创建、生命周期、同步机制以及高级并发工具。通过实际示例和代码片段,读者将学会如何有效地管理和协调线程,以编写高效且稳定的并发应用程序。