深入理解Java 8的流式API:简化代码,提升效率

news2024/9/21 16:45:27

在这里插入图片描述

文章目录

  • 深入理解Java 8的流式API:简化代码,提升效率
    • 一、流 Stream
    • 二、Int | Long | Double Stream
    • 三、收集器 Collectors

深入理解Java 8的流式API:简化代码,提升效率

Java 8引入了Stream API,它提供了一种新的抽象,可以更方便地对集合进行操作和处理。

想深入了解Stream流的小伙伴可以看看我以前的源码文章

1、 深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘_jdk中的流-CSDN博客

2、 Java流操作解析:深度剖析中间操作、终端操作与并行处理机制_流操作 中间操作有哪些-CSDN博客

一、流 Stream

Stream API允许我们以一种声明性的方式处理数据,支持函数式编程风格。

String流主要特性和用法

  1. 创建流
    • 从集合创建:通过集合的stream()方法或parallelStream()方法来创建流。
    • 从数组创建:使用Arrays.stream(array)方法。
    • 使用静态工厂方法:如Stream.of()IntStream.range()等。
  2. 中间操作
    • filter(Predicate):根据条件过滤流中的元素。
    • map(Function):将流中的每个元素映射为另一个元素。
    • sorted():对流进行排序。
    • distinct():去除流中重复的元素。
    • limit(long):限制流中元素的数量。
  3. 终端操作
    • forEach(Consumer):对流中的每个元素执行操作。
    • collect(Collectors):将流元素归约和汇总成一个值,如List、Set、Map等。
    • reduce():归约操作,可以将流中的元素反复结合起来,得到一个值。
    • min()max():找出流中的最小和最大值。
    • count():返回流中元素的总数。
    • anyMatch(), allMatch(), noneMatch():检查流中是否存在满足条件的元素。

如何使用Java 8的Stream API来操作集合

public static void main(String[] args) {
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");

        // 打印非空字符串的数量:使用`filter`方法过滤出非空字符串,然后使用`count`方法获取数量
        long count = strings.stream()
                .filter(string -> !string.isEmpty())
                .count();
        System.out.println("非空字符串数量:" + count);

        // 打印非空字符串的列表:使用`filter`方法过滤出非空字符串,然后使用`collect(Collectors.toList())`将结果收集为List
        List<String> filtered = strings.stream()
                .filter(string -> !string.isEmpty())
                .collect(Collectors.toList());
        System.out.println("非空字符串列表:" + filtered);

        // 使用逗号连接非空字符串:使用`filter`方法过滤出非空字符串,然后使用`collect(Collectors.joining(", "))`连接成一个字符串
        String mergedString = strings.stream()
                .filter(string -> !string.isEmpty())
                .collect(Collectors.joining(", "));
        System.out.println("连接后的字符串:" + mergedString);

        // 获取最长的字符串:使用`max`方法找到最长的字符串,如果找不到则返回空字符串
        String longestString = strings.stream()
                .max((s1, s2) -> s1.length() - s2.length())
                .orElse("");
        System.out.println("最长的字符串:" + longestString);
    }

二、Int | Long | Double Stream

IntStreamLongStreamDoubleStream 是基本类型的流,提供了对整数、长整数和双精度浮点数的高效处理。

IntStream 的元素类型为 int

  • 创建方式
    • range(int startInclusive, int endExclusive):创建一个范围在 [startInclusive, endExclusive) 内的 IntStream
    • rangeClosed(int startInclusive, int endInclusive):创建一个范围在 [startInclusive, endInclusive] 内的 IntStream
    • of(int... values):从一组整数值创建一个 IntStream
  • 常用方法
    • sum():对流中的所有整数求和。
    • average():计算流中所有整数的平均值。
    • min()max():找出流中的最小和最大值。
    • forEach(IntConsumer action):对流中的每个整数执行指定操作。

LongStream 的元素类型为 long

  • 创建方式
    • range(long startInclusive, long endExclusive):创建一个范围在 [startInclusive, endExclusive) 内的 LongStream
    • rangeClosed(long startInclusive, long endInclusive):创建一个范围在 [startInclusive, endInclusive] 内的 LongStream
    • of(long... values):从一组长整数值创建一个 LongStream
  • 常用方法
    • sum():对流中的所有长整数求和。
    • average():计算流中所有长整数的平均值。
    • min()max():找出流中的最小和最大值。
    • forEach(LongConsumer action):对流中的每个长整数执行指定操作。

DoubleStream 的元素类型为 double

  • 创建方式
    • of(double... values):从一组双精度浮点数值创建一个 DoubleStream
    • range(double startInclusive, double endInclusive):创建一个在指定范围内的 DoubleStream
  • 常用方法
    • sum():对流中的所有双精度浮点数求和。
    • average():计算流中所有双精度浮点数的平均值。
    • min()max():找出流中的最小和最大值。
    • forEach(DoubleConsumer action):对流中的每个双精度浮点数执行指定操作。

使用 IntStreamLongStreamDoubleStream 基本的操作

 public static void main(String[] args) {
        // IntStream 
        IntStream.range(1, 5)
                .forEach(System.out::print);  
        // 输出:1234
        System.out.println();

        int sum = IntStream.of(1, 2, 3, 4, 5)
                .sum();  
     	// 计算总和:15
        System.out.println("Sum of integers: " + sum);

        // LongStream 
        long max = LongStream.rangeClosed(1, 10)
                .max()
                .orElse(0);  
     	// 找出最大值:10
        System.out.println("Max of long integers: " + max);

        // DoubleStream
        double average = DoubleStream.of(1.5, 2.5, 3.5, 4.5)
                .average()
                .orElse(0.0);  
     	// 计算平均值:3.0
        System.out.println("Average of doubles: " + average);
    }

三、收集器 Collectors

收集器(Collectors)用于将流的元素累积到集合中,或者进行聚合操作。在使用流进行数据处理时,收集器是非常有用的工具,它们能够简化代码并提高效率。

常用的收集器及其用法:

  1. toList()

    • 将流中的元素收集到一个列表中。
    List<String> list = stream.collect(Collectors.toList());
    
  2. toSet()

    • 将流中的元素收集到一个集合(集合元素不重复)中。
    Set<String> set = stream.collect(Collectors.toSet());
    
  3. toMap()

    • 将流中的元素根据指定的 keyMapper 和 valueMapper 转换为 Map。
    Map<Integer, String> map = stream.collect(Collectors.toMap(String::length, Function.identity()));
    
  4. joining()

    • 连接流中的元素成为一个字符串。
    String result = stream.collect(Collectors.joining(", "));
    
  5. groupingBy()

    • 根据某个属性对流中的元素进行分组,生成一个 Map,键为属性,值为对应属性的元素列表。
    Map<Integer, List<String>> groupedByLength = stream.collect(Collectors.groupingBy(String::length));
    
  6. partitioningBy()

    • 根据一个条件将流中的元素分为两组,生成一个 Map,键为 true/false,值为满足条件的元素列表。
    Map<Boolean, List<String>> partitioned = stream.collect(Collectors.partitioningBy(s -> s.length() > 3));
    
  7. summarizingInt() / summarizingDouble() / summarizingLong()

    • 统计流中元素的汇总信息,如最大值、最小值、平均值、总和等。
    IntSummaryStatistics stats = stream.collect(Collectors.summarizingInt(String::length));
    
    

如何将一个字符串流收集成一个列表,并按长度分组

public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "banana", "grape", "pear", "orange");

        // 将流中的元素收集到一个列表中
        List<String> wordList = words.stream()
                                    .collect(Collectors.toList());
        System.out.println("List of words: " + wordList);

        // 根据字符串长度分组
        Map<Integer, List<String>> groupedByLength = words.stream()
                                                        .collect(Collectors.groupingBy(String::length));
        System.out.println("Words grouped by length: " + groupedByLength);
    }

智者的梦再美,也不如愚人实干的脚印

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

String 和StringBuilder字符串操作快慢的举例比较

System.currentTimeMillis(); //当前时间与1970年1月1日午夜UTC之间的毫秒差。public class HelloWorld {public static void main(String[] args) {String s1 "";StringBuilder s2 new StringBuilder("");long time System.currentTimeMillis();long s…

Django Web框架~后台美化

1、执行命令 pip install django-simpleui 2、注册simpleui到项目中 3、访问http://127.0.0.1/admin/ 4、设置中文 5、收集admin静态文件 python manage.py collectstatic

Zookeeper入门篇,了解ZK存储特点

Zookeeper入门篇&#xff0c;了解ZK存储特点 前言一、为什么要用 Zookeeper&#xff1f;二、Zookeeper存储特色1. 树状结构2. 节点类型 三、存储位置1. 内存存储1. DataTree2. DataNode 2. 硬盘存储1. 事务日志2. 快照 前言 继上次说完 Zookeeper 的安装后&#xff0c;已经过去…

设计模式学习[2]---策略模式+简单工厂回顾

文章目录 前言1.简单工厂模式回顾2.策略模式3.策略模式简单工厂的结合总结 前言 上一篇讲到简单工厂模式。 在我的理解中工厂的存在就是&#xff0c;为了实例化对象。根据不同条件实例化不同的对象的作用。 这篇博客写的策略模式&#xff0c;可以说是把这个根据不同情况实例化…

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

使用Vue.js集成百度地图WebGL实现3D地图应用

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用Vue.js集成百度地图WebGL实现3D地图应用 应用场景介绍 本代码用于在Vue.js应用程序中集成百度地图WebGL&#xff0c;实现3D地图的可视化展示。它可以应用于各种场景&#xff0c;例如&#xff1a; 城市规…

助燃新质生产力,魔珐科技亮相IMC2024制造业数字科技大会展示有言AIGC视频工具价值

2024年7月19日&#xff0c;IMC2024第八届制造业数字科技大会在上海盛大开幕&#xff0c;本次大会以《向“智”而行》为主题&#xff0c;250智能制造行业数字化转型企业、行业领军者及实践者共聚一堂&#xff0c;共同助力企业增强技术“硬核力”&#xff0c;为新质生产力蓄势赋能…

【SpringBoot3】全局异常处理

【SpringBoot3】全局异常处理 一、全局异常处理器step1&#xff1a;创建收入数字的页面step2:创建控制器&#xff0c;计算两个整数相除step3:创建自定义异常处理器step5&#xff1a;创建给用提示的页面step6&#xff1a;测试输入&#xff08;10/0&#xff09; 二、BeanValidato…

TCP/IP网络模型详解

在计算机网络领域&#xff0c;网络模型通常指的是 OSI&#xff08;Open Systems Interconnection&#xff09;参考模型或 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;模型。这些模型描述了网络中数据传输的层次结构&#xff0c;便于理解和…

ROS2从入门到精通2-3:详解机器人3D物理仿真Gazebo与案例分析

目录 0 专栏介绍1 什么是Gazebo?2 Gazebo架构2.1 Gazebo前后端2.2 Gazebo文件格式2.3 Gazebo环境变量3 Gazebo安装与基本界面4 搭建自己的地图4.1 编辑地图4.2 保存地图4.3 加载地图5 常见问题0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有…

【面试八股文】计算机操作系统

参考&#xff1a;大佬图解文章 → 小林coding 简介&#xff1a;之前在学习小林大佬的八股文时&#xff0c;摘录了一些个人认为比较重要的内容&#xff0c;方便后续自己复习。【持续更新ing ~&#x1f4af;】 注&#xff1a;加五角星标注的&#xff0c;是当前掌握不牢固的&…

WEB攻防-通用漏洞-SQL注入-MYSQL-union一般注入

前置知识 MySQL5.0以后存放一个默认数据库information_schemaschemata表存放该用户创建的所有库名&#xff0c;schemata. schema_name字段存放库名tables表存放该用户创建的所有库名和表明&#xff0c;tables.table_schema字段存放库名&#xff0c;tables.table_name存放表名co…

Elastic 及阿里云 AI 搜索 Tech Day 将于 7 月 27 日在上海举办

活动主题 面向开发者的 AI 搜索相关技术分享&#xff0c;如 RAG、多模态搜索、向量检索等。 活动介绍 参加 Elastic 原厂与阿里云联合举办的 Generative AI 技术交流分享日。借助 The Elastic Search AI Platform&#xff0c; 使用开放且灵活的企业解决方案&#xff0c;以前所…

基于YOLO8的目标检测系统:开启智能视觉识别之旅

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…

Spring Cloud GateWay(4.1.4)

介绍 该项目提供了一个建立在 Spring 生态系统之上的 API 网关&#xff0c;包括&#xff1a;Spring 6、Spring Boot 3 和 Project Reactor。Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API&#xff0c;并为其提供跨领域关注点&#xff0c;例如&#xff1a;安…

华清数据结构day3 24-7-18

基于昨天代码增加增删改查功能 zy.h #ifndef ZY_H #define ZY_H #define MAX 100 //最大容量 //定义学生类型 struct Stu {char name[20];int age;double score; }; //定义班级类型 struct Class {struct Stu student[MAX]; //存放学生的容器int size; //实际…

【Git】(基础篇五)—— Git进阶

Git进阶 之前关于本地和远程仓库的各种操作都已经非常基础了&#xff0c;本文介绍git的一些进阶使用和设置 用户名和邮箱 之前介绍的每一次提交(commit) 都会产生一条日志(log) 信息&#xff0c;这条日志信息不仅会记录提交信息&#xff0c;还会记录执行提交操作的这个用户的…

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…

ClusterIP、NodePort、LoadBalancer 和 ExternalName

Service 定义 在 Kubernetes 中&#xff0c;由于Pod 是有生命周期的&#xff0c;如果 Pod 重启它的 IP 可能会发生变化以及升级的时候会重建 Pod&#xff0c;我们需要 Service 服务去动态的关联这些 Pod 的 IP 和端口&#xff0c;从而使我们前端用户访问不受后端变更的干扰。 …

SpringBoot Security OAuth2实现单点登录SSO(附源码)

文章目录 基础概念1. 用户认证2. 单点登录&#xff08;SSO&#xff09;3. 授权管理4. 安全性和配置 逻辑实现配置认证服务器配置Spring Security两个客户端 页面展示本篇小结 更多相关内容可查看 附源码地址&#xff1a;https://gitee.com/its-a-little-bad/SSO.git 基础概念 …