成为Java流专家–第2部分:中级操作

就像魔术棒一样,中间操作将一个Stream转换为另一个Stream。 这些操作可以无穷无尽的方式组合在一起,以可读有效的方式执行从简单到高度复杂的任务。

本文是五分之二,其中还有一个GitHub存储库,其中包含每个单元的说明和练习。

  • 第1部分:创建流
  • 第2部分:中级操作
  • 第三部分:终端操作
  • 第4部分:数据库流
  • 第5部分:使用流创建数据库应用程序

中级业务

中间操作充当应如何转换Stream元素的声明性(功能性)描述,它们共同构成了元素流经的管道。 该行结尾的内容自然取决于管道的设计方式。

与机械流水线相反,Stream流水线中的中间操作可能(*)呈现新的Stream,该流可能取决于先前阶段中的元素。 对于map操作(我们将在稍后介绍),新的Stream甚至可能包含其他类型的元素。

(*)严格来说,不要求执行中间操作来创建新的Stream。 相反,它可以更新其内部状态,或者,如果中间操作未进行任何更改(例如.skip(0) ),则返回上一级的现有Stream。

要大致了解管道的外观,请回想一下上一篇文章中使用的示例:

 List<String> list = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .filter(s -> s.startsWith( "L" )) .map(String::toUpperCase) .sorted() .collect(toList());  System.out.println(list); 
 [LEMUR, LION] 

现在,我们将继续详细解释这些操作和其他操作的含义。

根据我们的经验, filter()是Stream API最有用的操作之一。 它使您可以将Stream缩小为适合特定条件的元素。 此类标准必须表示为Predicate (导致boolean值的函数),例如lambda。 以下代码的目的是查找以字母“ L”开头的字符串,并丢弃其他字符串。

 Stream<String> startsWithT = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .filter(s -> s.startsWith( "L" )); 
 startsWithT: [Lion, Lemur] 

有一些非常简单但功能强大的操作,提供了一种根据元素在Stream中的位置选择或丢弃元素的方法。 这些操作中的第一个是limit(n) ,它基本上按照其说的进行操作–它创建一个新流,该流仅包含应用该流的前n个元素。 下面的示例说明了如何将四只动物的流简化为仅“猴子”和“狮子”。

 Stream<String> firstTwo = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .limit( 2 ); 
 firstTwo: [Monkey, Lion] 


同样,如果只对线下的某些元素感兴趣,则可以使用.skip(n) -operation。 如果将skip(2)应用于动物流,则会留下尾巴两个元素“长颈鹿”和“狐猴”。

 Stream<String> firstTwo = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .skip( 2 ); 
 lastTwo: [Giraffe, Lemur] 

在某些情况下,流中每个元素只需要出现一次即可。 无需手动筛选出任何重复项,而是为此目的存在了一个指定的操作-distinct distinct() 。 它将使用Object::equals检查是否相等,并返回仅包含唯一元素的新Stream。 这类似于集合。

 Stream<String> uniqueAnimals = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" , "Lion"  ) .distinct(); 
 uniqueAnimals: [“Monkey”, “Lion”, “Giraffe”, “Lemur”] 


有时,元素的顺序很重要,在这种情况下,我们希望控制事物的排序方式。 最简单的方法是使用排序操作,该操作将以自然顺序排列元素。 对于以下字符串,这表示字母顺序。

 Stream<String> alphabeticOrder = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .sorted(); 
 alphabeticOrder: [Giraffe, Lemur, Lion, Monkey] 


有时只能以自然顺序排序可能会有些局限。 幸运的是,可以应用自定义Comparator来检查元素的某些属性。 例如,我们可以按照字符串的长度顺序对它们进行排序:

 Stream<String> lengthOrder = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .sorted(Comparator.comparing(String::length)); 
 lengthOrder: [Lion, Lemur, Monkey, Giraffe] 

我们可以应用于Stream的最通用的操作之一是map() 。 通过将Stream的元素映射到另一个值或类型,它可以将其转换为其他元素。 这意味着此操作的结果可以是任何类型R的Stream。 下面的示例执行从StringString的简单映射,将所有大写字母替换为它们的小写字母。

 Stream<String> lowerCase = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .map(String::toLowerCase); 
 lowerCase: [monkey, lion, giraffe, lemur] 


map-operation的三种特殊实现方式仅限于将元素映射到基本类型intdoubledouble
long

 .mapToInt();  .mapToDouble();  .mapToLong(); 

因此,这些操作的结果始终对应于IntStreamDoubleStreamLongStream 。 下面,我们演示如何使用.mapToInt()将动物映射到其名称的长度:

 IntStream lengths = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .mapToInt(String::length); 
 lengths: [ 6 , 4 , 7 , 5 ] 

注意:
String::length等于lambda s -> s.length() 。 我们更喜欢前一种表示法,因为它使代码更简洁易读。


尽管本文功能非常强大,但我们将很难理解它的最后一项操作。 它是有关map()操作,但是,而不是采取一个Function ,其从型变为T到返回类型R它需要一个Function ,其从型变为T并返回一个StreamR 。 然后将这些“内部”流平展为生成的流,从而将内部流的所有元素串联在一起。

 Stream<Character> chars = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur"  ) .flatMap(s -> s.chars().mapToObj(i -> ( char ) i)); 
 chars: [M, o, n, k, e, y, L, i, o, n, G, i, r, a, f, f, e, L, e, m, u, r] 


如果您尚未克隆关联的GitHub存储库,我们建议您现在进行克隆。 本文的内容足以解决名为MyUnit2Intermediate的第二个单元。 相应的Unit2Intermediate接口包含JavaDocs,它们描述MyUnit2MyIntermediate方法的预期实现。

 public interface Unit2Intermediate { /** * Return a Stream that contains words that are * longer than three characters. Shorter words * (ie words of length 0, 1, 2 and 3) * shall be filtered away from the stream. * <p> * A Stream of *     ["The", "quick", "quick", "brown", "fox", *     "jumps", "over", "the", "lazy", "dog"] * would produce a Stream of the elements *     ["quick", "quick", "brown", "jumps", *     "over", "lazy"] */ Stream<String> wordsLongerThanThreeChars(Stream<String> stream); 

提供的测试(例如Unit2MyIntermediateTest )将充当自动分级工具,让您知道您的解决方案是否正确。

下一篇

在下一篇文章中,我们将继续进行终端操作,并探索如何收集,计数或分组管道的结果元素。 在此之前–祝您编程愉快!

s

Per Minborg和Julia Gustafsson

翻译自: https://www.javacodegeeks.com/2019/10/become-a-master-of-java-streams-part-2-intermediate-operations.html

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

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

相关文章

HTML怎么在li中加select标签,自定义UL LI选择框似乎在其他HTML元素后面

我似乎无法弄清楚为什么我的自定义UL LI选择框出现在其他HTML元素后面。你如何解决这个问题&#xff0c;当用户点击选择框时&#xff0c;它会出现在其他页面元素的顶部&#xff1f;这里是手头的问题的一个画面&#xff1a; 下面是一个描绘所期望的结果&#xff1a; 这里是有问题…

java初学者面试_Java面试的前50个问题,面向初学者和经验丰富的程序员

java初学者面试您可以参加任何Java面试&#xff0c;无论是大四还是中级&#xff0c;经验或新来的人&#xff0c;一定会看到线​​程&#xff0c;并发和多线程中的几个问题。 实际上&#xff0c;这种内置的并发支持是Java编程语言的最强优势之一&#xff0c;并帮助它在企业界和程…

convert.todatetime指定日期格式_SQL基础知识V2——常用日期函数

点击上方SQL数据库开发&#xff0c;关注获取SQL视频教程SQL专栏SQL数据库基础知识汇总SQL数据库高级知识汇总日期函数是数据库中经常需要使用到的&#xff0c;本期将常用的几个日期函数给小伙伴做详细的介绍。GETDATE()GETDATE()函数用于返回当前数据库系统的日期和时间&#x…

恢复html的初始选定状态,Adobe Photoshop

了解如何在 Adobe Photoshop 中使用“还原/重做”命令和“历史记录”面板来控制图像的状态。通过使用“还原/重做”命令和“历史记录”面板&#xff0c;您可以轻松地控制图像的状态。使用还原或重做命令Photoshop CC 20.0(2018 年 10 月版)中的更新功能从 Photoshop CC 2018 年…

classcastexception异常_优雅的异常处理

代码正常运行不会出问题&#xff0c;但是遇到意外&#xff0c;参数变量&#xff0c;不符合要求&#xff0c;发生意外&#xff0c;代码终止运行代码中的异常处理好了&#xff0c;代码就可以顺利的继续运行&#xff01;3.3 最近我们遇到过的异常System.out.println(1/0);//java.l…

Spring Boot微服务,Docker和Kubernetes研讨会–第3部分

在之前的文章中&#xff0c;我们为使用Docker和Spring Boot的订单管理系统构建了一些微服务&#xff08;订单服务&#xff0c;产品服务&#xff0c;客户服务&#xff09;。 我们使用Netflix库来管理&#xff0c;发现和平衡微服务。 管理这些微服务及其多个容器可能会有些棘手&…

2021年茂名市高考成绩查询,2021年茂名高考最高分多少分,历年茂名高考状元

2021年茂名高考成绩公布时&#xff0c;茂名高考成绩最高分受到很多网友关注&#xff0c;具体2021年茂名高考最高分多少分&#xff0c;考生可以在聚志愿网站查询具体位次排名&#xff0c;报考茂名高考一分一段表位次排名、同分数人数、位次查询等相关数据。本期文章小编主要为大…

客制化键盘键位修改_可以用很漂亮形容的一把键盘,差一步就完美

内置钢板是轴体固定需要也是机械键盘的标志&#xff0c;钢板除了可以带来极其稳定的固定效果也成就了机械键盘扎实的手感&#xff0c;同时是机械键盘分量感的主要来源&#xff0c;给人一种结实感&#xff0c;这是薄膜键帽所不具备的。▲外置钢板在悬浮式结构的键盘上比较常见&a…

用于字符串和数组的5种简单有效的Java技术

Java通常会排在前五种最受欢迎​​的编程语言之内&#xff0c;这可以理解。 它是一种通用语言&#xff0c;非常容易学习&#xff0c;因为它是一种高级语言&#xff0c;并且可以满足许多用例。 由于这些原因&#xff0c;Java是一门伟大的语言&#xff0c;可以用来学习您是否有经…

基于html人事管理报告,基于C++builder的课程设计报告 (人事管理系统)

内容介绍原文档由会员 bshhty 发布Cbuilder课程设计( 人事信息管理系统 )12页 7000余字资料包含&#xff1a;完整课程设计报告&#xff0c;源代码等相关设计资料。本课程设计为RAR个文件。目录一、设计任务与要求………………………………………………31.设计内容……………………

adb 切换默认桌面_公告 | 武林外传手游官方服务器全面开放桌面版体验

为了更好的优化玩家游戏体验&#xff0c;应广大客官要求&#xff0c;《武林外传手游》全新桌面版今日上线&#xff0c;iOS及安卓服务器均可在电脑上畅玩《武林外传手游》啦&#xff01;大屏画面更加细腻绚丽&#xff0c;预设键位助你畅游江湖&#xff0c;欢迎广大玩家下载体验&…

计算机网络作业答案吴,中国大学《2020春季课程-计算机网络应用吴迪》答案全部2020高校邦《羽毛球》作业题库答案...

参考答案如下中国处理肌肉拉伤的第一步是()。大学迪答天下观念的核心问题是如何构建和谐社会。春季天下观念的核心是什么&#xff1f;天下有始&#xff0c;课程库答以为天下母。既得其母&#xff0c;课程库答以知其子&#xff1b;既知其子&#xff0c;复守其母&#xff0c;没身…

java获取word书签表格数据_Python读取word文档里面的表格数据

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;我们常见的办公数据通常可以分为结构化数据与非结构化数据&#xff0c;比如常见的word, ppt, excel。前两者存储的是非结构化数据&#xff0c;excel存储的是结构化数据。从事数据统计或分析的工作或多或少都会从excel获…

函数指针使用场景和选择_在N + 1场景中使用@NamedEntityGraph更有选择地加载JPA实体...

函数指针使用场景和选择N 1问题是使用ORM解决方案时的常见问题。 当您将某些OneToMany关系的fetchType设置为lazy时&#xff0c;就会发生这种情况&#xff0c;以便仅在访问Set / List时才加载子实体。 假设我们有一个具有两个关系的Customer实体&#xff1a;每个客户的一组订单…

东师计算机应用基础在线作业,东师《计算机应用基础》15春在线作业1答案

《计算机应用基础》15 春在线作业 1 单选题 多选题 判断题一、单选题(共 25 道试题&#xff0c;共 62.5 分。 )1. 21、 1946 年 2 月&#xff0c;在美国诞生了世界上第一台计算机&#xff0c;它的名字叫:A. EDVACB. EDSACC. ENIACD. UNIVAC-1----------------选择&#xff1a;C…

abb智能控制系统_ABB助力国网冀北电力打造虚拟电厂

近日&#xff0c;ABB为国网冀北电力有限公司定制了智能配电计量与协调控制解决方案&#xff0c;对其虚拟电厂进行远程电能管理&#xff0c;实现高峰调节和负载转移&#xff0c;提高电力系统效率&#xff0c;保持供电稳定性。虚拟电厂是通过分布式电力管理系统将电网中发电端(尤…

通过通用数据访问扩展AWS生态系统

Amazon Web Services&#xff08;AWS&#xff09;可帮助组织托管和管理其数据流程&#xff0c;例如构建数据可视化和执行ETL任务。 在CData&#xff0c;我们可以轻松地将AWS Services与异构业务应用程序和分布式数据存储连接起来&#xff0c;以最终帮助企业对其数据进行更全面的…

android官方文档中文版_Now in Android:01 - 如何掌握最新的 Android 技术?

每隔几天我都会通过 Android Developers 的油管官方频道&#xff0c;来了解一下最近 Android 发布了哪些有趣的新技术&#xff0c;最近发现官方推出了一个新的系列视频叫做&#xff1a;Now in Android&#xff0c;目前更新了 4 期&#xff0c;我觉得这个系列蛮有趣的&#xff0…

mvc路由 html,asp.net-mvc – ASP.NET MVC路由从html页面开始

我正在使用IIS 6.我想我的问题是我不知道如何使用routes.MapRoute路由到一个非控制器.我有一个url,如example.com,我希望它为index.htm页面提供服务,而不是使用MVC.我该如何设定&#xff1f;在IIS中,我将index.htm作为我的起始文档,我的global.asax具有标准的“默认”路由,其中…

c++ 反射_固体火箭发动机黏接壳体超声C扫描检测系统研制与应用

某固体火箭发动机燃烧室采用壳体/绝热层/包覆层/推进剂的多界面结构形式&#xff0c;其中绝热层采用玻璃纤维缠绕成型后与钢质旋压壳体胶接而成。在胶接过程中&#xff0c;若存在壳体内部多余物清理不干净、绝热层与壳体配合不严、胶层内部气体未排净等情况&#xff0c;黏接层易…