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() 方法打印每个元素。

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

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

相关文章

短信宝 php使用,[php] 使用 短信宝 发送短信(thinkphp)

/*** SmsBao实现类* category Think* package Think* subpackage Sms*/classSmsBao {private$account;//短信包账户private$password;//密码private$balance;//短信剩余条数constsendSmsUrl "http://api.smsbao.com/sms";constqueryBalanceUrl "http://api.smsb…

chrome github上不去 mac_码农大叔打赌,github上快速搜索优质开源项目,这些技能你不懂?...

GitHub的流行&#xff0c; GitHub在开源世界的受欢迎程度自不必多言。再加上今天&#xff0c;GitHub官方又搞了个大新闻&#xff1a;私有仓库也改为免费使用&#xff0c;这在原来可是需要真金白银的买的。可见微软收购后&#xff0c;依然没有改变 GitHub 的定位&#xff0c;甚至…

matlab保存数据到excel_Excel意外退出数据未保存?这个方法可以帮你找回所有数据...

老师们每天都需要完成大量的教学工作&#xff0c;且他们的每一个工作都是跟文字或数据打交道&#xff0c;Excel也逐渐成为了大家日常办公中的必备软件。在利用Excel办公时&#xff0c;通常是这么一个操作流程——新建、编辑、保存。编辑的时间可能是几分钟&#xff0c;也可能是…

c 调用matlab文件路径,C/C++下调用matlab函数操作说明

1.matlab的安装连接&#xff1a;http://pan.baidu.com/s/1qXuF7aO安装32位版本的matlab(在目录下bin文件夹中有两个文件夹&#xff0c;选择win32文件夹下的setup进行安装)2.matlab mex编译器配置安装完matlab之后&#xff0c;需要设定对应的c编译器才能编译.m文件生成可供c调用…

linux tomcat环境变量配置_Tomcat

Tomcat介绍1.Web服务器介绍Web服务器可以解析HTTP协议&#xff0c;收到请求后可以进行响应&#xff0c;比如响应静态资源、进行页面跳转等Web服务器响应可委托给CGI脚本、JSP脚本、ASP脚本、服务器端JS等程序或其它服务器端技术Web服务器通常产生一个html响应以便浏览器浏览2.常…

desktop docker 无法卸载_Docker容器无法停止或移除-权限被拒绝错误

问题 &#xff1a;无法停止泊坞窗容器&#xff0c;每当我尝试停止容器时&#xff0c;都会收到以下错误消息&#xff0c;ERROR: for yattyadocker_web_1 cannot stop container: 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: Cannot kill container 1f04…

oracle crs 命令,ORACLE RAC CRSCTL 命令使用 及 执行的用户

oracle rac crsctl命令使用查看crs资源状态[griddb1 ~]$ crs_stat -tName Type Target State Host------------------------------------------------------------ora.DATA.dg ora....up.type ONLINE ONLINE db1ora.FRA.dg ora....up.type ONLINE ONLINEdb1ora....ER.…

一直未运行_【直击一线】延一转三相分离器投运成功,盘活全区生产运行一盘棋...

喜 讯4月30日上午17点30点&#xff0c;新安边作业区延一接转注水站上新更换的三相分离器一次投运成功&#xff0c;这个好消息不胫而走传遍了全区收获获赞声一片&#xff0c;这也是对连日来奋战在施工作业现场的新安边人最大的褒奖。 延一接转注水站全貌延一接转注水站是新安边…

python字符串长度_在python中如何获取字符串的长度

python中如何获取字符串的长度&#xff1f;本篇文章就给大家介绍4种在python中计算并输出字符串长度的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。 Python中的字符串是Unicode代码点的不可变序列。给定一个字符串&#xff0c…

python的py文件打包成exe_将python项目.py文件打包成.exe文件

安装pyinstaller包pip3 install pyinstaller如果不行pip3 install pyinstaller -i https://pypi.doubanio.com/simple准备一个你要打包的.py文件&#xff0c;cd到该文件路径下&#xff0c;打开cmd在命令行中输入&#xff1a;pyinstaller -F xxx.py或者pyinstaller.exe -F xxx.p…

python处理字典的方法_python字典的常用操作方法小结

Python字典是另一种可变容器模型(无序)&#xff0c;且可存储任意类型对象&#xff0c;如字符串、数字、元组等其他容器模型。本文章主要介绍Python中字典(Dict)的详解操作方法,包含创建、访问、删除、其它操作等,需要的朋友可以参考下。 字典由键和对应值成对组成。字典也被称作…

oracle rowed,oracle bitmap索引内部揭密,欢迎补充

位图(bitmap)索引是另外一种索引类型&#xff0c;它的组织形式与B树索引相同&#xff0c;也是一棵平衡树。与B树索引的区别在于叶子节点里存放索引条目的方式不同。从前面我们知道&#xff0c;B树索引的叶子节点里&#xff0c;对于表里的每个数据行&#xff0c;如果被索引列的值…

linux 谷歌浏览器设置代理_linux下chrome+Proxy Switchy+ssh和firefox+autoproxy+ssh | 学步园...

继之前firefoxautoproxytorprivoxy失效之后&#xff0c;找到了更简单更快速的ssh代理方法&#xff1a;chromeProxy Switchyssh和firefoxautoproxyssh。两种方法都需要一个ssh用户&#xff0c;到这里免费申请&#xff1a;http://www.cjb.net/cgi-bin/shell.cgi?actionsignup。1…

asp.mvc 4项目发布文件目录结构_Spring Boot项目搭建与启动

Spring Boot简介Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发…

主成分分析碎石图_主成分分析大全

1 背景主成分分析法是数据挖掘中常用的一种降维算法,是Pearson在1901年提出的,再后来由hotelling在1933年加以发展提出的一种多变量的统计方法&#xff0c;其最主要的用途在于“降维”&#xff0c;通过析取主成分显出的最大的个别差异,也可以用来削减回归分析和聚类分析中变量的…

oracle中删除表字段 sql语句怎么写,oracle使用sql语句增加字段示例(sql删除字段语句)...

添加字段的语法&#xff1a;alter table tablename add (column datatype [default value][null/not null],….);修改字段的语法&#xff1a;alter table tablename modify (column datatype [default value][null/not null],….);删除字段的语法&#xff1a;alter table table…

windows7系统适合哪个python_Python3.6.4在Windows7系统下安装配置教程

Python3.64在Windows7系统下安装配置教程 工具/原料 Windows7系统 python3.6.4版本 方法/步骤 1 双击应用程序打开如图所示的界面这里是应用程序向导界面 这里建议勾选底部的自动写入path&#xff0c;然后点击自定义选项&#xff08;如图&#xff09;&#xff08;当然你也可以选…

ios 获取沙河文件夹_iOS开发之获取沙盒路径

iOS开发之沙盒机制(SandBox)详细讲解了沙盒的一些机制。在开发中&#xff0c;我们需要对沙盒进行操作&#xff0c;所以我们需要获取到沙盒路径。沙盒里的文件夹包括Documents、Library、tmp。这三个文件夹的作用请点击这里。接下来我们来讲解如何获取Documents、Library、tmp的…

php软删除代码,PHP laeavel软删除以及软删除还原 易错点

PHP laeavel软删除以及软删除还原 易错点PHP laeavel软删除以及软删除还原 易错点首先 数据库字段添加deleted_at字段然后在模型层中引入 SoftDeletes类 并引用use Illuminate\Database\Eloquent\SoftDeletes;控制器正常执行删除代码//软删除public function del(int $id){//$r…

为何控件删除不了_过不好又离不了的婚姻,不如这样去处理

你是否常常感慨&#xff0c;走过了那么长的路&#xff0c;看遍了那么多的繁花&#xff0c;听过了那么多的道理&#xff0c;却依然过不好这一生&#xff1f;明明已经很用心的去生活了&#xff0c;明明已经尽了最大的努力了&#xff0c;生活依然如同一团乱麻&#xff0c;处理不好…