成为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可视化为数据流经的管道(请参见下图)。 管道的功能将通过例如过滤,映射和分类项目来对数据进行操作。 最后,可以执行终端操作以收集首选数据结构(例如
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

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

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

相关文章

python做一副54扑克牌发牌技巧_德州扑克讲堂:高级技巧 胜率之摊牌胜率的算法...

行动胜率的算法。行动获胜是德州扑克中唯二的获胜方式&#xff0c;掌握了对手的弃牌率的话&#xff0c;就算手里完全没牌也可以轻松获胜。然而具体打出对手稳定的弃牌则是一种高级技巧。对于初学玩家&#xff0c;推荐掌握好摊牌胜率的算法&#xff0c;稳当地用摊牌来获胜。胜率…

java 6 基础教程_Java小白入门教程(6)——循环语句

提纲&#xff1a;1、循环结构2、while循环3、do-while循环4、for循环5、break语句6、continue语句7、循环嵌套8、作业一、循环结构1.1 概念条件满足&#xff0c;某些代码会被反复多次的执行。条件不成立了&#xff0c;循环结束。0-n次。1.2 为什么使用循环开发中可能会把某些代…

事件触发控制_SystemVerilog线程控制与通信

01线程控制1.概述线程&#xff0c;即独立运行的程序&#xff1b;线程需要被触发执行&#xff0c;可以结束或者不结束&#xff1b;在module中的initial和always&#xff0c;都可以看作独立的线程&#xff0c;他们在仿真0时刻开始&#xff0c;而选择结束或者不结束&#xff1b;在…

java writablesheet_jxl加边框,jxl合并单元格,单元格的设置,单元格居中

jxl加边框WritableWorkbook wwb Workbook.createWorkbook(os);WritableSheet ws wwb.createSheet( "TestSheet1 ", 0);WritableFont wf newWritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);WritableCellFormat wcf new WritableCellFormat(wf);w…

java必读书籍_最佳5本Java性能调优书籍–精选,必读

java必读书籍为什么Java开发人员应该阅读有关性能调优的书&#xff1f; 当我很久以前第一次面对这个问题时&#xff0c;我以为以后会做&#xff0c;但是我很长一段时间都没有回过头来。 仅当我在用Java编写的任务关键型服务器端财务应用程序中遇到严重的性能和可伸缩性问题时&a…

python为什么装不了pip_python自带pip用不了怎么办

可以通过以下命令来判断是否已安装&#xff1a;pip --version如果你还未安装&#xff0c;则可以使用以下方法来安装&#xff1a;$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 下载安装脚本$ sudo python get-pip.py # 运行安装脚本注意&#xff1a;用哪个…

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

SQL一直是一种声明性语言&#xff0c;而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式&#xff0c;并学习如何使用Java流对RDBMS数据库执行声明性查询&#xff0c;而无需编写任何SQL代码。 您会发现&#xff0c;Java流和SQL命令的动词之间有着惊人…

unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至&#xff0c;Java 9中将移除 Sun.misc.UnsafeOracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难&#xff0c;有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下…

python 代码格式规范脚本_Python编码规范

Python自动化测试代码编码规范一、适用范围&#xff1a;本规则基础为Python标准PEP8&#xff0c;在此基础上加了我司测试部编码规范&#xff0c;适用于测试部所有Python脚本编写是采用的规则.二、编码&#xff1a;所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件&#xff0c;而且还可以用于加载资源&#xff0c;例如属性文件&#xff0c;图像&#xff0c;图标&#xff0c;缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容&#xff0c;误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09;例如&#xff1a; 给…

使用测微计收集应用程序指标

什么是千分尺&#xff1f; 千分尺是一个简单的外观&#xff0c;用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持&#xff0c;包括Atlas&#xff0c;Datadog&#xff0c;Elastic&#xff0c;JMX等。…

java鼠标左键按下后拖动实现多选_鼠标拖拽多选功能

鼠标拖拽多选功能*{box-sizing:border-box;}ul{width:500px;height:auto;margin:0;padding:20px;font-size: 0;/*需设置定位*/position:relative;}li{width:70px;height:70px;margin:10px;padding:0;display:inline-block;vertical-align: top;font-size: 13px;border:1px soli…

python epoll多路复用技术_python IO 多路复用 epoll简单模型

IO多路复用就是我们说的select poll epoll通过一种机制使一个进程能同时等待多个文件描述符&#xff0c;而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态&#xff0c;epoll()函数就可以返回。所以&#xff0c;IO多路复用&#xff0c;本质上不会有并发的功能&#…

python3多线程协程_python3-----多进程、多线程、多协程

目前计算机程序一般会遇到两类I/O&#xff1a;硬盘I/O和网络I/O。我就针对网络I/O的场景分析下python3下进程、线程、协程效率的对比。进程采用multiprocessing.Pool进程池&#xff0c;线程是自己封装的进程池&#xff0c;协程采用gevent的库。用python3自带的urlllib.request和…

Apache CXF 3.0:CDI 1.1支持替代Spring

几周前刚刚发布了Apache CXF 3.0 &#xff0c;该项目又迈出了满足JAX-RS 2.0规范要求的又一个重要步骤&#xff1a;与CDI 1.1集成。 在此博客文章中&#xff0c;我们将看几个有关Apache CXF 3.0和Apache CXF 3.0如何协同工作的示例。 从3.0版开始&#xff0c; Apache CXF包含一…

java varbinary_SQL 中存放 varbinary型数据

使用带有 BULK 选项的 OPENROWSET以下 Transact-SQL 增强功能支持 OPENROWSET(BULK...)函数&#xff1a;与 SELECT 一起使用的 FROM 子句可以调用 OPENROWSET(BULK...)而非表名&#xff0c;同时可以实现完整的 SELECT 功能。带有 BULK 选项的 OPENROWSET 在 FROM 子句中需要有一…

python矩阵左除_matlab学习笔记

Matlab学习笔记运算&#xff1a;1. 算术运算(在矩阵意义下进行):要求矩阵同型,对应元素相加减&#xff0c;如果用标量和矩阵相加减&#xff0c;不同型就凉凉提示错误&#xff0c;那就将矩阵每个元素和数字相加减-&#xff1a;同上*&#xff1a;A*B要求左行右列&#xff0c;…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c;我们将通过Docker使…