成为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…

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

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

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

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

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…

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

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

java scala_经过几天的Scala回归Java的10个最烦人的事情

java scala因此&#xff0c;我正在尝试使用Scala&#xff0c;因为我想编写一个解析器&#xff0c;而Scala Parsers API似乎非常合适。 毕竟&#xff0c;我可以在Scala中实现解析器并将其包装在Java接口后面&#xff0c;因此除了附加的运行时依赖关系之外&#xff0c;应该不存在…

python区域找图命令_python读取图片任意范围区域

使用python进行图片处理&#xff0c;现在需要读出图片的任意一块区域&#xff0c;并将其转化为一维数组&#xff0c;方便后续卷积操作的使用。 下面使用两种方法进行处理&#xff1a; convert 函数 from PIL import Image import numpy as np import matplotlib.pyplot as plt …

[MEGA DEAL] Ultimate SQL Bootcamp认证捆绑包(98%)

像Pro一样管理任务和数据库&#xff0c;提供有关SQL Lite&#xff0c;Microsoft SQL&#xff0c;MySQL&#xff0c;PostgreSQL&#xff0c;Rest API和Oracle SQL的6门课程 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店 &#xff0c;我们提供了另一…

jersey spring_教程–带有Jersey和Spring的Java REST API设计和实现

jersey spring想要在Java中使用REST&#xff1f; 然后您来对地方了&#xff0c;因为在博客文章中&#xff0c;我将向您介绍如何“美丽”地设计REST API&#xff0c;以及如何使用Jersey框架在Java中实现它。 本教程中开发的RESTful API将演示针对存储在MySql数据库中的播客资源的…

html5 css svg,6款基于SVG的HTML5CSS3应用和动画

1、CSS3/SVG质感背景小图标 镂空效果图标按钮今天我们来分享一款用CSS3和SVG实现的质感背景小图标&#xff0c;鼠标滑过图标时出现镂空的效果&#xff0c;并且有质感背景的描边&#xff0c;效果非常不错。2、HTML5 SVG Tab滑块菜单 非常酷的Tab菜单之前我们分享过很多HTML5/CSS…

python 矩阵合并_numpy 的矩阵合并与分割

aiblog4.jpg 这次分享下numpy中矩阵的合并与分割&#xff0c;希望能帮助到大家。 在此附上视频链接 一、引入numpy第三方库 首先我们引入numpy这个第三方库,如果有同学没安装numpy可在命令行中pip install numpy进行安装(Mac用户 sudo pip3 install numpy) import numpy as np …