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,我们可以更方便地进行集合数据的处理和转换,提高程序的可读性和可维护性。


相关文章
|
10天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
18天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
47 4
|
26天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
1月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
38 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
1月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
24 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
1月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
1月前
|
存储 Java API
如何使用 Java 中的 API 更改 PDF 纸张大小
如何使用 Java 中的 API 更改 PDF 纸张大小
50 11
|
1月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
44 10
|
1月前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
33 1
|
1月前
|
存储 Java 数据处理
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
36 1
下一篇
无影云桌面