成为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,一经查实,立即删除!

相关文章

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必读书籍_最佳5本Java性能调优书籍–精选,必读

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

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

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等。…

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

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

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理数据的分步过程。 在此示例中&#xff0c;我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中&#xff0c;这个问题被提及的比例是相当高的&#xff0c;这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数&#xff1f;“我应该选择几个分区&#xff1f;”——如果你在Kaf…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种&#xff1a;内排序和外排序。在排序过程中&#xff0c;全部记录存放在内存&#xff0c;则称为内排序&#xff0c;如果排序过程中需要使用外存&#xff0c;则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类&#xff1a;(1) 插入排…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后&#xff0c;充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格&#xff0c;而且型号也是一样的。那么&#xff0c;我们先一起来看看比亚迪版华为…

JMetro版本11.5.10和8.5.10发布

在这里&#xff0c;我们再次使用JMetro的另一个版本。 此版本中的新增功能&#xff1a; 工具栏内控件的新样式 新的可编辑组合框样式 对其他样式的一些调整 一些修复 继续阅读以获取详细信息。 可编辑的ComboBox新样式 JMetro早期版本的可编辑ComboBox看起来非常糟糕&am…

1s后跳转 android_优雅保活方案,原来Android还可以这样保活

作者&#xff1a;NanBox保活现状我们知道&#xff0c;Android 系统会存在杀后台进程的情况&#xff0c;并且随着系统版本的更新&#xff0c;杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的&#xff0c;因为可以节省内存&#xff0c;降低功耗&#xff0c;也避免…

wordpress致命错误怎么解决_pppoe错误是什么意思 pppoe错误怎么解决

最近有网友反应无线路由器上设置PPPoE拨号上网后&#xff0c;发现PPPoE连接不上&#xff0c;显示pppoe错误是什么意思呢?pppoe错误怎么解决呢?接下来详细为大家介绍&#xff1a;pppoe错误怎么解决无线路由器设置PPPoE拨号后&#xff0c;PPPoE拨号连接不上&#xff0c;不能够上…

java ssm 多租户_(十一)java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统- SSO单点登录之OAuth2.0登录流程(2)...

上一篇是站在巨人的肩膀上去研究OAuth2.0&#xff0c;也是为了快速帮助大家认识OAuth2.0&#xff0c;闲话少说&#xff0c;我根据框架中OAuth2.0的使用总结&#xff0c;画了一个简单的流程图(根据用户名密码实现OAuth2.0的登录认证)&#xff1a;上面的图很清楚的描述了当前登录…

几何画板200个经典课件_项目制学科联动 | 金芬娥首席工作室:灵动“画板”,研修创新,协同进步...

西湖区成立115个“项目制首席教师工作室”&#xff0c;建立中小学、幼儿园学科联动机制&#xff0c;以专业发展为目标&#xff0c;以教育问题为导向&#xff0c;整合发挥学科教研员、学科带头人和名师工作室领衔人的智力资源&#xff0c;助推教师的专业成长及区域的学科建设。西…