成为Java流大师–第1部分:创建流
在许多情况下,声明性代码(例如,具有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可视化为数据流经的管道(请参见下图)。 管道的功能将通过例如过滤,映射和分类项目来对数据进行操作。 最后,可以执行终端操作以收集首选数据结构(例如
List
, Array
或Map
。 需要注意的重要一点是,流只能使用一次。
流管道包含三个主要部分; 流源,中间操作(零到很多)和终端操作。
让我们看一个例子,以了解我们将在整个系列中教的内容。 我们鼓励您看下面的代码,并尝试在阅读下一段之前弄清楚打印语句的结果。
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实现; IntStream
, LongStream
和DoubleStream
只能处理相应的原始类型。
可以通过以下方式调用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部分:创建流相关推荐
- 第十三章、IO流_File类与递归/基本流/增强流/属性集与打印流__黑马Java第57期个人学习笔记_个人笔记
第一节.File类与递归 一.File类 (一)概念: 1.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作.(也重写了toString为getPath) 2.绝对路 ...
- 【Java笔记】File类与IO流(另添加NIO2使用)
文章目录 本章专题与脉络 java.io.File类的使用 概述 构造器 常用方法 获取文件和目录基本信息 列出目录的下一级 File类的重命名功能 判断功能的方法 创建.删除功能 NIO2的使用 P ...
- java 用流创建流_成为Java流大师–第1部分:创建流
java 用流创建流 在许多情况下,声明性代码(例如,具有Streams的功能组合)提供了出色的代码指标. 通过该动手实验文章系列进行编码,并成为Java Streams的主教练,从而成为一名更好的J ...
- 成为Java流大师–第6部分:使用流创建新的数据库应用程序
您是否曾经想开发数据库应用程序的"快速"版本? 在此动手实验文章中,您将学习一种真正简单而直接的方法. 整个Java域模型将自动为您生成. 您只需连接到现有数据库,然后开始使用Ja ...
- java –cp ./:_成为Java流大师–第3部分:终端操作
java –cp ./: 比尔·盖茨曾经说过:"我选择一个懒惰的人去做一件困难的事情,因为一个懒惰的人会找到一个简单的方法来做." 关于流,没有什么比这更真实了. 在本文中,您将学 ...
- java流写入数据库_成为Java流大师–第4部分:数据库流
java流写入数据库 SQL一直是一种声明性语言,而Java长期以来势在必行. Java流改变了游戏规则. 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需 ...
- java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流
java联接pg库 是否可以将联接的数据库表转换为Java Stream? 答案是肯定的. 由于我们已经多次提出这个问题,因此我们决定写另一篇动手实验文章,说明如何执行更高级的Stream Joins ...
- 成为Java流大师–第4部分:数据库流
SQL一直是一种声明性语言,而Java长期以来势在必行. Java流改变了游戏规则. 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需编写任何SQL代码. ...
- 成为Java流大师–第5部分:将联接的数据库表转换为流
是否可以将联接的数据库表转换为Java Stream? 答案是肯定的. 既然我们已经多次提出这个问题,我们决定写另一篇动手实验文章,解释如何执行更高级的Stream Joins. 因此,这里是第六篇中 ...
最新文章
- poj 1873 枚举+凸包
- mapreduce编程实例python-Python编写MapReduce作业的简单示例
- leetcode算法题--删除链表的倒数第N个节点
- Redis集群解决方案比较
- 揭开知识库问答KB-QA的面纱2·语义解析篇
- java 酒店系统_基于JAVA的酒店管理系统
- Oracle Purge和drop的区别
- Google Guava:您永远不会知道的5件事
- Jmeter 通过Groovy保存数据到CSV
- idea 编译 maven 项目
- 全国计算机一级试题重难点,全国计算机等级考试一级MS选择题(重难点)部分.doc...
- 继iptables之后的新一代包过滤框架是nftables
- c 宏变量/宏函数/log
- MyCat分布式数据库集群架构工作笔记0009---Mycat主--从复制配置上
- reactrouter监听路由变化_前端路由三种模式
- java年龄不能超过120,systemd 代码行数超过 120 万,创始人贡献的 commits 最多
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题
- 使用Python构造数据包
- 七大热门小程序框架横评,谁是性能之王
- ObjectARX标注公差简单实例
热门文章
- codeforces1167 E. Range Deleting(双指针)
- codeforces1453 E. Dog Snacks
- 【期望】【高斯消元】图上游走(金牌导航 期望-6)
- CF449B Jzzhu and Cities(Dijkstra)
- BZOJ5358: [Lydsy1805月赛]口算训练
- IDEA一定要改的8条配置
- MySQL extract()函数
- 一道丧心病狂的java面试题
- Echarts报错:Component series.lines not exists. Load it first.
- Java GUI界面