在许多情况下,声明性代码(例如,具有Streams的功能组合)可提供出色的代码指标。 通过本动手实验文章系列进行编码,并成为Java Streams的主教练,从而成为一名更好的Java程序员。

Streams的整个想法是代表一个数据流经的管道,并且管道的功能将对数据进行操作。 这样,可以表达对元素流的功能风格的操作。 本文是五分之一的内容,您将直接学习如何成为流大师。 我们从基本的流示例开始,然后进行更复杂的任务,直到您知道如何将标准Java流连接到Cloud中的数据库。

Streams的整个想法是代表一个数据流经的管道,并且管道的功能将对数据进行操作。 这样,可以表达对元素流的功能风格的操作。 本文是五分之一的内容,您将直接学习如何成为流大师。 我们从基本的流示例开始,然后进行更复杂的任务,直到您知道如何将标准Java流连接到Cloud中的数据库。

完成所有五篇文章之后,您将能够大幅度减少代码库,并知道如何在一瞬间为整个应用程序编写纯Java代码。

这是即将发表的文章的摘要:

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

由于我们坚信“边做边学”的概念,因此该系列由GitHub存储库进行了补充,该存储库包含分为5个单元的Stream练习–每个单元对应于文章的主题。 README文件中提供了有关如何使用源代码的说明。

什么是Java流?

Java Stream接口最初是在Java 8中引入的,并且与lambda一起成为Java开发的里程碑,因为它极大地促进了声明性(功能性)编程风格。 如果您想了解更多有关声明式编码的优势,请参考本文 。

可以将Java Stream可视化为数据流经的管道(请参见下图)。 管道的功能将通过例如过滤,映射和分类项目来对数据进行操作。 最后,可以执行终端操作以收集首选数据结构(例如
ListArrayMap 。 需要注意的重要一点是,流只能使用一次。


流管道包含三个主要部分; 流源,中间操作(零到很多)和终端操作。

让我们看一个例子,以了解我们将在整个系列中教的内容。 我们鼓励您看下面的代码,并尝试在阅读下一段之前弄清楚打印语句的结果。

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

由于Stream API具有描述性,并且通常使用起来非常直观,因此无论您之前是否遇到过这些操作,您都可能会对这些操作的含义有很好的了解。 我们从包含四个字符串的List流开始,每个字符串代表非洲动物。 然后,这些操作会过滤出以字母“ L”开头的元素,将其余元素转换为大写字母,然后以自然顺序(在这种情况下表示字母顺序)对其进行排序,最后将它们收集到List 。 因此,产生输出[“LEMUR”, “LION”]

重要的是要理解,流是“惰性的”,即终端操作是“请求”元素的(在这种情况下,
.collect()语句)。 如果终端操作仅需要一个元素(例如,终端操作.findFirst() ),则最多.findFirst()有一个元素到达终端操作,并且提醒元素(如果有的话)将永远不会产生资源。 这也意味着仅创建Stream通常是一种便宜的操作,而消耗它可能会很昂贵,具体取决于流管道和流中潜在元素的数量。

在这种情况下,流源是一个List尽管许多其他类型也可以充当数据源。 我们将在本文的其余部分中介绍一些最有用的源替代方法。

流主要适合于处理对象的集合,并且可以对任何类型T元素进行操作。 尽管存在三种特殊的Stream实现; IntStreamLongStreamDoubleStream只能处理相应的原始类型。

可以通过以下方式调用Stream.empty()来生成任何这些类型的空Stream:

Stream <T>     Stream.empty()
IntStream  IntStream.empty()
LongStream  LongStream.empty()
DoubleStream  DoubleStream.empty()

在某些情况下,空流确实很方便,但是大多数时候,我们有兴趣用元素填充流。 这可以通过许多方式来实现。 我们将首先研究IntStream的特殊情况,因为它提供了多种有用的方法。

一个基本情况是在少量项目上生成流。 这可以通过使用IntStream.of()列出整数来完成。 下面的代码产生元素1、2和3的简单流。

IntStream oneTwoThree = IntStream.of(1, 2, 3);

如果项目数量增加,手动列出所有元素可能很乏味。 如果我们对某个范围内的值感兴趣,则命令.rangeClosed()更有效。 该操作包含所有内容,这意味着以下代码将生成从1到9的所有元素的流。

 IntStream positiveSingleDigits = IntStream.rangeClosed( 1 , 9 ); 

.iterate()甚至是更强大的命令,它可以在包含哪些数字方面提供更大的灵活性。 下面,我们显示一个示例,说明如何使用它来生成具有2的幂的所有数字的Stream。

 IntStream powersOfTwo = IntStream.iterate( 1 , i -> i * 2 ); 

还有几种可能更意外的方式来生成Stream。 chars()方法可用于流式处理
String ,在这种情况下为元素“ A”,“ B”和“ C”。

 IntStream chars = "ABC" .chars(); 

还有一种生成随机整数流的简单方法。

 IntStream randomInts = new Random().ints(); 

流现有数据收集是另一种选择。 我们可以流式传输现有Array的元素,或者选择使用Stream.of()手动列出项目,如前所示并在下面重复。

String[] array = {"Monkey", "Lion", "Giraffe", "Lemur"};
Stream <String> stream2 = Stream.of(array);
Stream <String> stream = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");

流任何Collection也是非常简单的。 下面的示例演示如何使用简单命令流式传输List或Set
.stream()

List <String> list = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
Stream <String> streamFromList = list.stream();
Set set = new HashSet<>(list);
Stream <String> streamFromSet = set.stream();

有时,流式传输文本文件的内容也很有用。 以下命令将提供一个Stream ,将引用文件中的每一行作为单独的元素保存。

Stream <String> lines = Files.lines(Paths.get("file.txt"));

现在,我们已经使您熟悉了创建Stream的一些方法,我们鼓励您克隆此GitHub存储库并开始练习。 本文的内容足以解决第一个称为“创建”的单元。 Unit1Create接口包含JavaDocs,它们描述了Unit1MyCreate方法的预期实现。

public interface Unit1Create {/*** Creates a new Stream of String objects that contains* the elements "A", "B" and "C" in order.** @return a new Stream of String objects that contains*   the elements "A", "B" and "C" in order*/Stream <String> newStreamOfAToC();

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


如果尚未这样做,请继续解决Unit1MyCreate类中的工作项。 “需要把他们全都抓到”。

在下一篇文章中,我们将继续描述可应用于这些Stream并将它们转换为其他Stream的几种中间操作。 再见!

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

成为Java流大师–第1部分:创建流相关推荐

  1. 第十三章、IO流_File类与递归/基本流/增强流/属性集与打印流__黑马Java第57期个人学习笔记_个人笔记

    第一节.File类与递归 一.File类 (一)概念: 1.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作.(也重写了toString为getPath) 2.绝对路 ...

  2. 【Java笔记】File类与IO流(另添加NIO2使用)

    文章目录 本章专题与脉络 java.io.File类的使用 概述 构造器 常用方法 获取文件和目录基本信息 列出目录的下一级 File类的重命名功能 判断功能的方法 创建.删除功能 NIO2的使用 P ...

  3. java 用流创建流_成为Java流大师–第1部分:创建流

    java 用流创建流 在许多情况下,声明性代码(例如,具有Streams的功能组合)提供了出色的代码指标. 通过该动手实验文章系列进行编码,并成为Java Streams的主教练,从而成为一名更好的J ...

  4. 成为Java流大师–第6部分:使用流创建新的数据库应用程序

    您是否曾经想开发数据库应用程序的"快速"版本? 在此动手实验文章中,您将学习一种真正简单而直接的方法. 整个Java域模型将自动为您生成. 您只需连接到现有数据库,然后开始使用Ja ...

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

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

  6. java流写入数据库_成为Java流大师–第4部分:数据库流

    java流写入数据库 SQL一直是一种声明性语言,而Java长期以来势在必行. Java流改变了游戏规则. 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需 ...

  7. java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流

    java联接pg库 是否可以将联接的数据库表转换为Java Stream? 答案是肯定的. 由于我们已经多次提出这个问题,因此我们决定写另一篇动手实验文章,说明如何执行更高级的Stream Joins ...

  8. 成为Java流大师–第4部分:数据库流

    SQL一直是一种声明性语言,而Java长期以来势在必行. Java流改变了游戏规则. 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需编写任何SQL代码. ...

  9. 成为Java流大师–第5部分:将联接的数据库表转换为流

    是否可以将联接的数据库表转换为Java Stream? 答案是肯定的. 既然我们已经多次提出这个问题,我们决定写另一篇动手实验文章,解释如何执行更高级的Stream Joins. 因此,这里是第六篇中 ...

最新文章

  1. poj 1873 枚举+凸包
  2. mapreduce编程实例python-Python编写MapReduce作业的简单示例
  3. leetcode算法题--删除链表的倒数第N个节点
  4. Redis集群解决方案比较
  5. 揭开知识库问答KB-QA的面纱2·语义解析篇
  6. java 酒店系统_基于JAVA的酒店管理系统
  7. Oracle Purge和drop的区别
  8. Google Guava:您永远不会知道的5件事
  9. Jmeter 通过Groovy保存数据到CSV
  10. idea 编译 maven 项目
  11. 全国计算机一级试题重难点,全国计算机等级考试一级MS选择题(重难点)部分.doc...
  12. 继iptables之后的新一代包过滤框架是nftables
  13. c 宏变量/宏函数/log
  14. MyCat分布式数据库集群架构工作笔记0009---Mycat主--从复制配置上
  15. reactrouter监听路由变化_前端路由三种模式
  16. java年龄不能超过120,systemd 代码行数超过 120 万,创始人贡献的 commits 最多
  17. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题
  18. 使用Python构造数据包
  19. 七大热门小程序框架横评,谁是性能之王
  20. ObjectARX标注公差简单实例

热门文章

  1. codeforces1167 E. Range Deleting(双指针)
  2. codeforces1453 E. Dog Snacks
  3. 【期望】【高斯消元】图上游走(金牌导航 期望-6)
  4. CF449B Jzzhu and Cities(Dijkstra)
  5. BZOJ5358: [Lydsy1805月赛]口算训练
  6. IDEA一定要改的8条配置
  7. MySQL extract()函数
  8. 一道丧心病狂的java面试题
  9. Echarts报错:Component series.lines not exists. Load it first.
  10. Java GUI界面