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天前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
17 4
|
4天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
1天前
|
Java 程序员 API
Java 8 Lambda 表达式和Stream API:概念、优势和实战应用
【5月更文挑战第20天】在Java 8中,Lambda 表达式和Stream API是两个非常强大的特性,它们显著改变了Java程序员处理数据和编写代码的方式。本篇技术文章将深入探讨这些特性的概念、优点,并提供实战示例,帮助理解如何有效地利用这些工具来编写更简洁、更高效的代码。
18 6
|
3天前
|
安全 Java API
Java进阶-Java Stream API详解与使用
效、更易于维护的代码,同时享受到函数式编程带来的好处。
12 2
|
3天前
|
Java 大数据 API
利用Java Stream API实现高效数据处理
在大数据和云计算时代,数据处理效率成为了软件开发者必须面对的重要挑战。Java 8及以后版本引入的Stream API为开发者提供了一种声明式、函数式的数据处理方式,极大提升了数据处理的效率和可读性。本文将详细介绍Java Stream API的基本概念、使用方法和性能优势,并通过实际案例展示如何在实际项目中应用Stream API实现高效数据处理。
|
Java API
Java 8 Stream API详解
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/47038607 Java ...
982 0
|
4天前
|
监控 安全 数据挖掘
Email 接口API有哪些?具体分析一下阿里云和AOK的优点
本文介绍了常见的Email接口API,如阿里云邮件推送、AOKSend、SendGrid、Mailgun和Amazon SES。阿里云API以其高稳定性和数据分析功能脱颖而出,支持批量发送和多语言;而AOKSend API以易于集成、高安全性和优秀客户支持为亮点。企业在选择时应考虑自身需求和预算,以优化邮件营销效果。
|
4天前
|
定位技术 API
Angular 调用导入百度地图API接口,2024春招BAT面试真题详解
Angular 调用导入百度地图API接口,2024春招BAT面试真题详解
|
5天前
|
JSON 安全 API
解锁淘宝商品评论API接口:电商数据分析的新视角
淘宝商品评论API接口是淘宝开放平台提供的一组API接口,允许开发者通过编程方式获取淘宝商品评论数据。这些接口可以获取到商品的详细信息、用户评论、评分等数据,为电商数据分析提供了丰富的素材。
|
5天前
|
缓存 负载均衡 安全
探索API接口开发(定制与开发接口)
在当今数字化、互联互通的时代,API(应用程序编程接口)已经成为连接不同软件、服务和应用的关键桥梁。API接口开发,作为软件架构和系统设计的重要组成部分,不仅影响着数据交换的效率,更决定了整个系统的灵活性和可扩展性。本文将深入探讨API接口开发的各个方面,包括其重要性、开发流程、最佳实践以及面临的挑战。