当前位置: 首页 > news >正文

Java 8中流Stream API详解

先给个示例,展示Java 8流API的优势

假设我们有以下任务:

给定一个字符串列表,我们需要执行以下操作:

  1. 筛选出所有以"A"开头的字符串。

  2. 将这些字符串转换为大写。

  3. 对这些字符串按照长度进行排序。

  4. 最后,将这些字符串连接成一个以逗号分隔的单个字符串。

    Java 7及之前的实现:

    在Java 7中,实现这一功能需要多步骤处理,涉及到循环、条件判断、排序和字符串拼接等多个环节。

    List<String> inputList = Arrays.asList("Apple", "An", "Banana", "Avocado", "Apricot", "Blueberry");
    List<String> filteredList = new ArrayList<String>();
    for (String s : inputList) {if (s.startsWith("A")) {filteredList.add(s.toUpperCase());}
    }
    Collections.sort(filteredList, new Comparator<String>() {public int compare(String s1, String s2) {return Integer.compare(s1.length(), s2.length());}
    });StringBuilder sb = new StringBuilder();
    for (int i = 0; i < filteredList.size(); i++) {sb.append(filteredList.get(i));if (i < filteredList.size() - 1) {sb.append(", ");}
    }
    String result = sb.toString();
    

    Java 8使用流的实现:

    相同的任务可以使用Java 8的流API以更简洁、更直观的方式实现:

    List<String> inputList = Arrays.asList("Apple", "An", "Banana", "Avocado", "Apricot", "Blueberry");
    String result = inputList.stream().filter(s -> s.startsWith("A")).map(String::toUpperCase).sorted(Comparator.comparingInt(String::length)).collect(Collectors.joining(", "));
    

    对比

    在Java 7的实现中,我们需要显式地进行循环、条件判断、排序和字符串拼接,这不仅使代码变得更长,也使得逻辑更难以一眼看明。而在Java 8的实现中,所有这些操作都被整合进了一个流水线式的链式调用中,每个步骤都清晰、直观。filtermapsortedcollect等方法的使用使得代码更易读和维护。特别是使用Collectors.joining直接将筛选和转换后的字符串列表拼接成一个字符串,大大简化了代码。这个例子清楚地展示了Java 8流API的强大能力,特别是在处理复杂的集合操作时,其优势是非常明显的。

一、什么是流Stream?

Java 8的流Stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作(bulk data operation)。Stream API可以极大提高Java程序员的生产力,让程序员写出高效、干净、简洁的代码。

Java 8的Stream API提供了一种高效、声明式处理集合的方法。使用Stream API,你可以对集合执行复杂的查询、过滤、转换、排序等操作,而无需关心底层的实现细节。

二、为什么要用流?

Java 8引入了流(Stream)是为了更方便、更灵活地处理集合数据。流提供了一种新的抽象,让开发者能够以声明性的方式对数据进行操作,而不再需要显式地使用迭代器或写大量的循环代码。

三、不用流会怎样?

虽然不使用流仍然可以实现相同的功能,但使用流可以提供更简洁、更高效、更易于维护的代码,尤其是在处理复杂的数据操作时。流API是Java 8中的一个重要特性,它极大地改善了Java语言在处理集合方面的能力。

四、流Stream有啥特点

  • 不是数据结构:它不存储数据,只是用来操作数据源(如集合、数组等)中的数据。
  • 不改变原对象:它不会修改原对象,相反,它会返回一个持有结果的新Stream。
  • 惰性执行:操作是延迟执行的,这意味着它们会等到需要结果的时候才执行。
  • 可消费性:Stream只能被消费一次。一旦遍历过就会失效。

五、流的常用方法?

Stream操作分为两种:中间操作和终端操作。

中间操作
  • map (映射):将元素转换成其他形式或提取信息。

    stream.map(String::toUpperCase);
    
  • filter (过滤):排除某些元素。

    stream.filter(e -> e.length() > 2);
    
  • sorted (排序):确保流按照某种准则排序。

    stream.sorted(Comparator.comparingInt(String::length));
    
  • limit (限制):减少流的大小。

    stream.limit(5);
    
  • distinct (去重):通过流所生成元素的 hashCode() 和 equals() 去除重复元素。

    stream.distinct();
    
终端操作
  • forEach (迭代):迭代流中的每个数据。

    stream.forEach(System.out::println);
    
  • collect (收集):将流转换为其他形式。

    List<String> list = stream.collect(Collectors.toList());
    
  • reduce (归约):将流中的所有元素重复结合起来,得到一个值。

    Integer sum = numbers.stream().reduce(0, Integer::sum);
    
  • anyMatch、allMatch、noneMatch (匹配):检查流中是否有一个或多个元素匹配给定的谓词。

    boolean anyMatch = stream.anyMatch(e -> e.startsWith("A"));
    
  • count (计数):返回流中元素的个数。

    long count = stream.count();
    
  • findFirst、findAny (查找):返回流中的第一个或任意一个元素。

    Optional<String> first = stream.findFirst();
    

六、示例

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");myList.stream().filter(s -> s.startsWith("c")).map(String::toUpperCase).sorted().forEach(System.out::println); // C1, C2

在此示例中,stream() 创建了一个流,filter() 方法过滤掉非 “c” 开头的字符串,map() 方法将每个字符串转换为大写,sorted() 方法对字符串进行排序,最后 forEach() 方法打印每个元素。

相关文章:

Java 8中流Stream API详解

先给个示例&#xff0c;展示Java 8流API的优势 假设我们有以下任务&#xff1a; 给定一个字符串列表&#xff0c;我们需要执行以下操作&#xff1a; 筛选出所有以"A"开头的字符串。 将这些字符串转换为大写。 对这些字符串按照长度进行排序。 最后&#xff0c;将…...

通过 xlsx 解析上传excel的数据

一、前言 在前端开发中&#xff0c;特别是在后台管理系统中&#xff0c;导入数据&#xff08;上传excel&#xff09;到后端是是否常见的功能&#xff1b;而一般的实现方式都是通过接口将excel上传到后端&#xff0c;再有后端进行数据解析并做后续操作。 今天&#xff0c;来记录…...

Flink系列之:JDBC SQL 连接器

Flink系列之&#xff1a;JDBC SQL 连接器 一、JDBC SQL 连接器二、依赖三、创建 JDBC 表四、连接器参数五、键处理六、分区扫描七、Lookup Cache八、幂等写入九、JDBC Catalog十、JDBC Catalog 的使用十一、JDBC Catalog for PostgreSQL十二、JDBC Catalog for MySQL十三、数据…...

OpenCV与YOLO学习与研究指南

引言 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;是一个流行的实时对象检测系统。对于大学生和初学者而言&#xff0c;掌握这两项技术将大大提升他们在图像处理和机器视觉领域的能力。 基础知识储备 在深入…...

hive中map相关函数总结

目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址&#xff1a; hive官网函数大全地址 Return TypeNameDescriptionmapmap(key1, value1, key2, value2, …)Creates a map with the given key/value pairs.arraymap_values(Map<K.V>)Returns an un…...

HttpServletRequestWrapper、HttpServletResponseWrapper结合 过滤器 实现接口的加解密、国际化

目录 一、HttpServletRequestWrapper代码 二、HttpServletRequestWrapper代码 三、加解密过滤器代码 四、国际化过滤器代码 一、HttpServletRequestWrapper代码 package com.vteam.uap.security.httpWrapper;import jakarta.servlet.ReadListener; import jakarta.servlet.…...

最大通关数

洛洛和晶晶计划一起挑战峡谷深渊&#xff0c;峡谷左右有不同数量的关卡&#xff0c;每个关卡需要不同的紫水晶通关&#xff0c;用给定的紫水晶依次通过最多的关卡。 (笔记模板由python脚本于2023年12月23日 12:16:50创建&#xff0c;本篇笔记适合熟悉贪心算法的coder翻阅) 【学…...

MySQL中EXPLAIN关键字解释

什么是MySQL的索引 索引是帮助MySQL高效获取数据的数据结构 MySQL再存储数据之外&#xff0c;数据库系统中还维护者满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用表中的数据&#xff0c;这样我们就可以通过数据结构上实现的高级查找算法来快速…...

初始JavaScript详解【精选】

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍初始JavaScript以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区留言 目录 ⭐…...

计数排序,基数排序及排序总结

稳定性&#xff1a;当要排序的数组有相同数据时&#xff0c;排序后相同数据的相对位置不变&#xff0c;则称该排序算法稳定&#xff0c;否则即为不稳定. 在这里我在说说计数排序吧&#xff0c;计数排序就是将给定数组中的数进行计数&#xff0c;在从小到大依次输出即可。简单过…...

【LeetCode】459. 重复的子字符串(KMP2.0)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;459. 重复的子字符串 代码随想录题解地址&#xff1a;代码随想录 题目简介 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 看到题目的第一想法(可以贴代码&#xff09; 1.…...

CSS(五) -- 动效实现(立体盒子旋转-四方体+正六边)

一. 四面立体旋转 正方形旋转 小程序中 wxss中 <!-- 背景 --><view class"dragon"><!--旋转物体位置--><view class"dragon-position"><!--旋转 加透视 有立体的感觉--><view class"d-parent"><view …...

Win10使用OpenSSL生成证书的详细步骤(NodeJS Https服务器源码)

远程开启硬件权限&#xff0c;会用到SSL证书。 以下是Win10系统下用OpenSSL生成测试用证书的步骤。 Step 1. 下载OpenSSL,一般选择64位的MSI Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 一路点下来&#xff0c;如果后续请你捐款&#xff…...

sql_lab之sqli中的堆叠型注入(less-38)

堆叠注入&#xff08;less-38&#xff09; 1.判断注入类型 http://127.0.0.3/less-38/?id1 and 12 -- s 没有回显 http://127.0.0.3/less-38/?id1 and 11 -- s 有回显 则说明是单字节’注入 2.查询字段数 http://127.0.0.3/less-38/?id1 order by 4 -- s 报错 http:/…...

第5章-第3节-Java中对象的封装性以及局部变量、this、static

1、局部变量 【问题1】&#xff1a;什么是局部变量&#xff1f; 答&#xff1a;定义在局部位置的变量就是局部变量。 【问题2】&#xff1a;什么是局部位置&#xff1f; 答&#xff1a;方法的形参位置、方法体的内部。 【位置关系图】&#xff1a; class Xxx { //成员位…...

IP应用场景的规划

IP地址作为互联网通信的基石&#xff0c;在现代社会中扮演着至关重要的角色。本文将深入探讨IP地址在不同应用场景中的规划与拓展&#xff0c;探讨其在网络通信、安全、商业、医疗和智能城市等领域的关键作用与未来发展趋势。 IP地址的基本原理 IP地址是分配给网络上设备的数…...

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…...

计算机网络 网络安全技术

网络安全基本要素 机密性 不泄密完整性 信息不会被破坏可用性 授权用户 正常有效使用可控性 被控制可审查性 网络安全的结构层次 物理安全 物理介质安全控制 计算机操作系统安全服务 应用层次 被动攻击 :截获信息 主动攻击 : 中断信息,篡改,伪造 篡改 …...

WebAssembly 的魅力:高效、安全、跨平台(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

二维码智慧门牌管理系统升级:确保公安机关数据安全无忧

文章目录 前言一、多重安全防护措施二、安全措施综述与展望 前言 数据安全挑战与重要性 在数字化社会&#xff0c;数据安全对公共管理机构&#xff0c;尤其是公安机关而言&#xff0c;至关重要。随着二维码技术在门牌管理系统中的广泛应用&#xff0c;管理变得更智能、更便捷。…...

Perplexity搜索ACM结果不排序?揭秘影响因子加权算法逆向工程,自定义排序脚本已开源

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity ACM论文查询 Perplexity 是一款基于大语言模型的智能研究助手&#xff0c;支持对 ACM Digital Library 等权威学术资源进行语义化检索。与传统关键词搜索不同&#xff0c;它能理解自然语言提…...

VSCode连接Ubuntu虚拟机(VMware/VirtualBox)编辑文件,总提示Permission Denied?可能是这个共享文件夹权限问题

VSCode连接Ubuntu虚拟机编辑文件时Permission Denied的深度解决方案 跨平台开发已经成为现代开发者的标配工作流&#xff0c;而VSCode配合虚拟机更是常见的开发环境组合。但当你兴致勃勃地在Windows或macOS上通过VSCode连接到Ubuntu虚拟机&#xff0c;准备大展拳脚时&#xff0…...

基于Whisper与VS Code的语音编程氛围系统构建指南

1. 项目概述&#xff1a;当语音输入遇上沉浸式编程最近在GitHub上看到一个挺有意思的项目&#xff0c;叫voice-typing-vibe-coding。光看名字&#xff0c;你可能会觉得这又是一个简单的语音转代码工具&#xff0c;但实际体验下来&#xff0c;我发现它的野心远不止于此。它试图解…...

MIMO OFDM系统中的波束成形技术与定位感知优化

1. MIMO OFDM系统中的波束成形技术概述 在现代无线通信系统中&#xff0c;多输入多输出(MIMO)和正交频分复用(OFDM)技术的结合已成为提升系统性能的关键。波束成形作为MIMO系统的核心技术&#xff0c;通过优化天线阵列的辐射模式&#xff0c;实现信号在空间维度上的选择性传输。…...

LeetCode 单词搜索II题解

LeetCode 单词搜索II题解 题目描述 给定一个二维字符网格和一个字符串数组&#xff0c;找出所有在网格中出现的单词。 示例&#xff1a; 输入&#xff1a;board [["o","a","a","n"],["e","t","a",&quo…...

用C语言和mciSendString函数,在VS2019里写一个带进度条的音乐播放器(附完整源码)

用C语言打造可视化音乐播放器&#xff1a;从零实现带进度条的音频控制工具 在枯燥的控制台程序与炫酷的图形界面之间&#xff0c;存在一个被许多C语言学习者忽视的中间地带——通过Windows API实现简单而实用的可视化反馈。本文将带你用mciSendString函数构建一个带有实时进度条…...

NE555芯片深度解析:从内部原理到经典电路实战应用

1. 从一颗“老古董”聊起&#xff1a;为什么NE555今天依然值得你花时间&#xff1f;如果你在电子爱好者圈子里混过&#xff0c;哪怕只是刚入门&#xff0c;大概率都听过NE555这个名字。它不像现在的ARM、ESP32那样自带光环&#xff0c;也不像各种传感器模块那样“即插即用”。它…...

别傻傻手敲了!用C++文件读写自动生成OpenJudge NOI 1.1超级玛丽游戏代码

用C文件操作自动化生成OpenJudge NOI超级玛丽游戏代码 在信息学竞赛中&#xff0c;我们经常会遇到需要输出固定字符图案的题目&#xff0c;比如OpenJudge NOI 1.1中的超级玛丽游戏题目。手动编写这些图案的打印代码不仅耗时耗力&#xff0c;还容易出错。本文将介绍如何利用C的文…...

UE5.1材质AO通道填错了?详解“关闭允许静态光照后模型变黑”的材质陷阱

UE5.1材质AO通道填错引发的"模型变黑"问题深度解析 当你在UE5.1中关闭"允许静态光照"准备拥抱Lumen的动态光照魅力时&#xff0c;突然发现精心制作的模型变成了一团黑影——这不是引擎故障&#xff0c;而是材质系统中一个容易被忽视的"环境光遮蔽&…...

误删VM但存储文件还在?vCenter注册一键恢复

在vCenter运维过程中&#xff0c;很多运维人员会不小心误删虚拟机&#xff08;VM&#xff09;&#xff0c;删除后发现虚拟机的存储文件&#xff08;VMDK、VMX等&#xff09;仍保存在数据存储&#xff08;datastore&#xff09;中&#xff0c;顿时手足无措&#xff0c;担心数据丢…...