java –cp ./:

就像魔术棒一样,中间操作将一个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] 


映射操作还有三种特殊的实现方式,它们仅限于将元素映射到基本类型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

java –cp ./:

java –cp ./:_成为Java流专家–第2部分:中级操作相关推荐

  1. java –cp ./:_成为Java流大师–第3部分:终端操作

    java –cp ./: 比尔·盖茨曾经说过:"我选择一个懒惰的人去做一件困难的事情,因为一个懒惰的人会找到一个简单的方法来做." 关于流,没有什么比这更真实了. 在本文中,您将学 ...

  2. java实例_图例 | Java混合模式分析之火焰图实例

    这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...

  3. java书籍_学习Java最好的10本书,从入门到精通

    在当代,学习Java等编程课程的主要方式是视频资源,如果你想学,在网上五分钟之内就可以找到一堆学习视频,瞬间将你的硬盘填满.但是这些课程质量良莠不齐,对于小白来说很难辨别好坏. 但是书籍不同,书籍都是 ...

  4. 用gradle启动java项目_构建Java项目

    #构建Java项目# 上一节我们简要介绍了如何编写一个单机的To Do应用,接下来要打包部署成可执行的应用,我们需要编译源代码,生成的class文件需要打包到JAR文件中.JDK提供了javac 和j ...

  5. java常见_关于Java的常见误解

    java常见 Java是世界上使用最广泛的语言(需要引用),每个人对此都有自己的见解. 由于它是主流,所以通常会嘲笑它,有时是对的,但有时批评并没有触及现实. 我将尝试解释我最喜欢的5个关于Java的 ...

  6. 易语言 java支持_开源Java客户端可以连接易语言服务器

    我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后, 都要先跟当前的客户端通信完之后才能再处理下一个连接请求. 这在并发比较多的情况下会严重影响程序的性能, 为此,我们可 ...

  7. java 析构函数_《JAVA编程思想》5分钟速成:第5章(初始化和清理)

    第五章.初始化和清理 前言 1.初始化顺序(静态成员.非静态成员,构造器.父类构造器)的排序: 2.构造器(constructor)是否可被重写(override)? 3.final, finally ...

  8. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...

    最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...

  9. 图书借阅管理用java实现_用java实现图书管理系统。 - 惊觉...

    在学完java基础篇的时候,安排做了一个综合版的java基础项目,可以把之前学到的知识综合运用. 一.项目设计到的知识 1.MVC设计模式思想(分包) >项目分包 运用这种设计模式的优点: MV ...

最新文章

  1. break后面的语句还执行吗_流程控制语句
  2. poj2739(尺取法+质数筛)
  3. js选择checkbox值,组织成key-value形式,传值到后台
  4. easyui panel 默认折叠 右上角按钮
  5. c# websocketServer base64乱码
  6. 2.初识Python
  7. [css] 你了解CSS Houdini吗?说说它的运用场景有哪些?
  8. MySQL 修改数据
  9. (36)FPGA打N拍设计(第8天)
  10. python树形结构显示_Python将字典转换成树状的层次结构,并在tkin中显示
  11. Flink 1.11 Unaligned Checkpoint 解析
  12. Linux电源管理-Operating Performance Points(OPP)
  13. Linux 第12天: (08月19日) 练习和作业
  14. iOS核心动画之蒙版
  15. 《认知天性》:讲述基于科学的学习方法
  16. linux系统安装全局翻译,CentOS 6.4下安装翻译软件StarDict
  17. i78700k配什么显卡好_2K分辨率极致吃鸡 i7-8700K配GTX1070Ti吃鸡配置推荐 (全文)
  18. html 5新增技术,HTML5新增元素,标签总结
  19. 数字化时代:电梯广告的喜与忧
  20. java语言编写计算器_第二次作业利用java语言编写计算器进行四则运算

热门文章

  1. cf1555A. PizzaForces
  2. 2021牛客暑期多校训练营6
  3. Tickets HDU - 1260
  4. 【每日一题】8月12日题目精讲 Mr. Kitayuta, the Treasure Hunter
  5. 【每日一题】4月1日题目 Rinne Loves Edges
  6. CF662C Binary Table(FWT_XOR卷积)
  7. 技术情报局(笛卡尔树)
  8. 2019纪中暑假游记+总结
  9. jzoj4245-er【dp,贪心】
  10. [CSA35G][XSY3318]Counting Quests (DP)