《Java核心技术 卷2 高级特性》一

第一章 Java SE 8 的流库

流的定义

假设,words作为一个列表(List)类的实例,它存储了某本书的所有单词,现在需要对该书的长单词进行统计
根据一般的迭代方法

long count=0;
for(String w:words){
if(w.length()>12) count++;
}

而使用流的方法

long count = words.stream().filter(w->w.length()>12).count();

这里,stream方法会产生一个用于words列表的流(stream);filter方法会返回另一个流,其中包含长度大于12的单词;
count方法会将这个流简化为一个结果。

所以什么是流呢?书上说“流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图”。
流遵循着“做什么而非怎么做”的原则,就刚才的例子而言,相比迭代来说,用流来实现就不必指定具体该如何遍历列表等工作

流的创建

如果你有一个数组,那么可以使用静态的Stream.of方法

Stream<String> song = Stream.of("gently","down","the","stream");

而使用Array.stream(array,from,to)可以从数组中位于from(包括)和to(不包括)的元素中创建一个元素
若要创建不包含任何元素的流,可以使用Stream.empty();
Stream还有两个用于产生无限流的静态方法:generate方法和iterate方法

流的转换

流的转换会产生一个新的流,它的元素派生自另一个流中的元素
例如filter转换会产生一个流,它的元素和某种条件相匹配
能实现流转换的还有map和flatMap等,使用map时,会有一个函数应用到每个元素上,并且其结果是包含了应用该函数后所产生的所有结果的流
假设我们有一个字符串流上映射letters方法:

Stream<stream<String>> result = words.stream().map(w->letters(w));

那么得到一个包含流的流,就像[...["y","o","u","r"],["b","o","a","t"]...]。
为了将其摊平为字母流,可以使用flatMap方法

Stream<string> result = words.stream().flatMap(w->letters(w));

得到的结果为:[..."y","o","u","r","b","o","a","t",...]
stream.limit(n)会返回一个新的流,它在前n个元素之后结束
stream.skip(n),会返回一个新的流,但是会丢弃前n个元素
Stream类的静态contact方法会将两个流连接起来
distinct方法,会返回一个流,但是会剔除重复的元素
也可以使用sorted方法对流中的元素进行排序

简单约简

即如何从数据流中获取答案,约简是一种终结操作,它们会将流约简为可以在程序中使用的非流值
count方法就是一个例子,它返回流中元素的数量
其余的约简还有max和min方法,它们会返回最大值和最小值
还有经常与filter流转换方法搭配使用的findFirst、findAny、anyMatch、allMatch、noneMatch方法
这些方法返回的是一份类型Optional<T>的值,它要么包装了答案,要么表示没有任何值

至此,我们介绍了操作流的典型流程,即:
????1.创建一个流
????2.指定初始流转换为其他流的中间操作,可能包含多个步骤
????3.应用终止操作,从而产生结果

收集结果

当处理完流之后,若是想要查看流中的元素或者是想要将流中的元素收集到某些数据结构(如数组,集合和映射)中
可以调用toArray方法获得由流的元素构成的数组

String[] result = stream.toArray(String::new);

但是toArray方法返回的是Object[]数组,若是想要其具有正确的类型可以将其传递到数组构造器中

除了toArray方法外,还有一个便捷方法collect可用,如为了将流收集到列表或者集中

List<String> result = stream.collect(Collectors.toList());
//或者
Set<String> result = stream.collect(Collectors.toSet());

还可以利用Collectors.toMap方法将流收集到映射表中
toMap方法中有两个函数引元,它们用来生成映射表的键和值

除此之外,还可以利用groupingby方法来将具有相同特性的值聚集成组,groupingby方法会产生一个映射表,它的每一个值都是一个列表
如果想要以某种方式来处理这些列表,就需要提供一个“下游收集器”

基本类型流和并行流

基本类型流如:IntStream,LongStream和Doublestream
为了创建IntStream,需要调用IntStream.of和Arrays.Stream方法

IntStream stream = IntStream.of(1,1,2,3,5);
Stream = Arrays.Stream(values,from,to);

并行流
????可以使用Collection.parallelStream()方法从任何集合中获取一个并行流
????只要在终结方法执行时,流处于并行模式,那么所有的中间操作都将被并行化

原文地址:https://www.cnblogs.com/ASE265/p/12264501.html

时间: 2024-10-10 07:09:46

《Java核心技术 卷2 高级特性》一的相关文章

《三层理论篇》一

一.联系生活: 先从我们的生活场景说起,我们要吃烧烤,一种情况是在路边,有人摆摊,我们要完东西之后就在这看着等着烤好了,然后拿着开始吃,第二种情况是我们到一个小店只要坐下来有人过来问你想吃什么,你说完之后过会就会有人把你要的东西送过来(这两种场景估计大家都有过哈) 两种场景的烤肉过程: 我们生活中的这种烤肉现象就对应这我们系统的开发的两种方式,二层和三层(多层). 路边烤肉一个人什么都干,总有忙不过来出错的时候,当他积累到一定的钱之后可能就会去开店,这样就能满足更多的顾客. 从路边烤肉到开店的过

《三层理论篇》二

四.三层之间的联系 依赖:三层之间的关系 数据访问层的类:直接访问数据库,实现对基本记录的增删改查操作. 业务逻辑层的类:用相关的数据访问类,实现用户所需功能. 界面层:部署控件后,调用业务逻辑层的类,实现功能. 图解: 实体类:层之间的数据传输对象 为什么选择实体类作为三层之间的传输对象?  ORM(对象关系映射) Object Relational Mapping,简称ORM,是为了解决面向对象的类,与关系数据库的表之间,存在的不匹配的现象,通过使用描述对象和关系之间映射的元数据,在程序中的

三层学习------理论篇

学校放假了,刚回家的孩子就像个客人被父母招待着.在放假的前几天里,你尽管开口,想吃啥爸妈都会满足你,不过好景可不长!在我家,厨房是老妈的地盘,买菜.做饭.洗碗刷锅,一个人全包了.而在饭店吃饭呢,吃饭的人多了,顾客点的饭菜种类各不相同.前前后后,一个人忙乎,哪里顾得过来,所以饭店就有了分工.前台服务员负责将顾客点的菜上报给厨师和:厨师根据上报的菜单做菜:采购员负责柴米油盐酱醋茶.这样,大家各司其职,井井有条. 我们在家中吃饭比较简单,没有具体的分工.饭店就是一个复杂庞大的系统了,需要合理规划,分工

三层架构-------理论篇

概念: 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦合"的思想. 各层概念 1.表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 2.业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理. 3.数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添.删除.修改.查找等. 注:应用三层离不开另一个重要的类:实体类,

三层结构——理论篇

为什么要分层? 1.开发人员可以只关注整个结构中的其中某一层:2.可以很容易的用新的实现来替换原有层次的实现:3.可以降低层与层之间的依赖:4.有利于标准化:5.利于各层逻辑的复用.6..方便团队分工 分层: 将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦合"的思想. 1. 表现层 位于最外层(最上层),离用户最近.用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面.它是系统的UI部分,负责使用者与整个

三层架构理论篇

对于三层架构的理论阐述,我将从三个大的方面去讨论:what.why和how,说白了也就是以三层架构为中心,去了解什么是三层,为什么用三层以及怎么用三层这个三个问题.OK,废话不多说,进入正题. 什么是三层架构?(What) 通常多层结构的划分方式有两种:分别是物理和逻辑.物理上的三层结构是指将整个应用系统分为显示层.业务层和数据层,并且这三个层面上的实体都是硬件,比如显示层就是客户机器,业务层通常是应用程序服务器,而数据层就是数据库服务器了. 今天我们讨论的主要是逻辑上的三层架构,是在软件设计时

【SSH2(理论篇)】--Struts2配置详解

上篇博客讨论了SSH2框架模型,在开发过程中发现SSH2的开发模型其实类似于经典的三层模式,在每一层中分别添加了不同的框架,显示层使用的是Struts2进行配置的,业务逻辑层使用的是Spring配置,数据持久层则采用的是Hibernate,开发模式简单易懂,接下来将会分别从三层着手讨论每一层的运行内容. 一.Struts体系简介 struts,是Apache软件基金会(ASF)赞助的一个开源项目,它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-V

【机器学习】Logistic Regression 的前世今生(理论篇)

Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有非常多细节不正确之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/50359055 写这篇博客的动力是源于看到了以下这篇微博: 我在看到这篇微博的时候大为触动,由于,如果是rickjin来面试我.我想我会死的非常慘,由于他问的问题我基本都回答不上来.

Logistic Regression 的前世今生(理论篇)

[机器学习]Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/50359055 写这篇博客的动力是源于看到了下面这篇微博: 我在看到这篇微博的时候大为触动,因为,如果是rickjin来面试我,我想我会死的很惨,因为他问的问题我基本都回答不上

三层理论

什么是三层,是说的像房屋那样的三层么?当然不是啦,我这里要给大家说的三层是软件体系架构设计中的一种分层方式. 三层架构:通常意义上的三层架构就是整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的就是为了"高内聚,低耦合"的思想. 三层概念简介: 1.显示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 2.业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理. 3.数据访问层(