写给大忙人的JavaSE 8 - 学习
前面有提到过lambda和函数式接口,但是JavaSE 8 除了这两个新特性之后还提供了很多有用的东西。例如Stream。
摸索了几天,终于弄明白Stream的应用了。
先推荐一篇文章:Java 8 中的 Streams API 详解
这里的Stream,是对集合进行操作的API。有点像流水线作业,可以一条线下来,也可以分成多条线并行。
Stream不是数据结构,而是算法和计算。所以Stream只需要被告知做什么,而不需要被告知怎么做。
举个例子,一个集合A里面有很多元素,现在想对这些元素进行操作。
传统方式:迭代器或者for循环遍历,然后对每个迭代或者遍历的元素进行操作,某种意义上说,这是有序的执行。
Stream:你只需要传入需要对元素进行的操作即可(lambda)。
【】需要告诉它做什么,不需要告诉它怎么做。例如需要统计,而不必有顺序。
步骤:①创建一个Stream;②在一个或多个步骤中,指定将初始Stream转换成另一个Stream的中间操作;③使用一个终止操作来产生一个结果。之后Stream就不可用了。
Collection接口中的新方法,可以将任何一个对象转成Stream。如果是一个数组,可以使用Stream.of()转成Stream。
还有:Stream<Stream<Object>>这种。
【】如果要对Stream中的每个对象都进行某个操作,使用【stream.map(lambda);】即可。
【】但是,如果Stream中嵌套了Stream,那就需要使用【stream.flatMap(lambda);】。这时,lambda中需要调用Stream的方法进行操作。
【】【】【】flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Stream。
Stream的limit()方法,可以截取子Stream。可以用于Stream.generate(lambda).limit(100);
Stream的聚合操作,如count()、max()、min()等,可以参照数据库的聚合函数理解。
【】【】【】需要注意的是,这些聚合函数返回的是Optional对象,可以有效避免null情况--java8推荐的操作。
Stream.reduce(),常用的方法有average, sum, min, max, and count,返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值。
//reduce()接收一个起始值(种子),然后将种子和后面的进行操作,并将结果再次作为种子。--后台方法肯定会选择一个种子(要么手动声明,要么让后台选择)
//手动声明:stream.reduce(seed, lambda) 这里的lambda只需要声明一个参数,然后能同时操作seed和该参数并返回结果即可。
//后台选择:stream.reduce(lambda) 这里的lambda需要显式的声明两个参数。后台会将stream的元素填入其中。
Stream.collect与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值。
//collect需要接收三个参数(保存到什么类型的对象中、用该类型的什么方法接收、多个该类型的对象怎么联合-并行用)
//注意,①stream.collect返回的类型是保存到的类型。②Collectors中已经提供了同时具备三个参数的方法(多个方法)。
自定义stream:Stream.generate()和Stream.iterate()。
Stream.generate(Supplier)。
Stream.iterate(seed, f) 跟 reduce 操作很像,接受一个种子值,和一个 UnaryOperator(例如 f)。然后种子值成为 Stream 的第一个元素,f(seed) 为第二个,f(f(seed)) 第三个,以此类推。
【】【】如果是从Array等转成Stream,那这个Stream是有序的,但可以转成无序的。
【】【】【】【】简单说,对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect)。
写给大忙人的JavaSE 8 - 学习的更多相关文章
- 写给大忙人的spring cloud 1.x学习指南
这几天抽空搞了下spring cloud 1.x(2.0目前应该来说还不成熟),因为之前项目中使用dubbo以及自研的rpc框架,所以总体下来还是比较顺利,加上spring boot,不算笔记整理,三 ...
- JavaSE入门学习21:Java面向对象之接口(interface)(二)
一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.j ...
- 《写给大忙人看的java se 8》笔记
现在才来了解java8,是不是后知后觉了点? 新的编程技术,个人不喜欢第一时间跟进. 待社区已有实践积淀再切入似乎更划算些? 一点点精明的考虑. 不多说,上代码. //读<写给大忙人看的java ...
- javase建议学习路线
javase建议学习路线:1.环境的搭建2.基本变量类型3.流程控制4.数组5.集合6.IO7.异常8.线程9.网络编程
- 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结
虽然看过一些Java 8新特性的资料,但是平时很少用到,时间长了就忘了,正好借着Java 9的发布,来总结下一些Java 8中的新特性. 接口中的默认方法和静态方法 先考虑一个问题,如何向Java中的 ...
- JavaSE入门学习7:Java基础语法之语句(下)
继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for ...
- JavaSE的学习路线
基于现阶段的JavaEE学习的对象,主要是趋向于Web的方向,主要就是说在JavaWeb的基础上进行进一步的开发和学习,下面我会将自己总结的对于自己的一点关于JavaEE学习路线会逐步讲解. 第一部分 ...
- JavaSE入门学习6:Java基础语法之运算符和语句(上)
继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age ...
- 《写给大忙人看的Java核心技术》 勘误
先附上十分讨喜的封面.这应该是爱丽丝梦游仙境里的那只兔子吧? 勘误表基于原版勘误表制作 链接 截止日期 2017-02-09 对应<写给大忙人看的Java核心技术>2016年1月第1次印刷 ...
随机推荐
- lua——元表、元方法、继承
[元表] 元表中的键为事件(event),称值为元方法(metamethod). 通过函数getmetatable查询不论什么值的元表,通过函数setmetatable替换表的元表. setmetat ...
- ASP.NET自定义Web服务器控件-DropDownList/Select下拉列表控件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...
- Win2008 r2 IIS7.5出现FastCGI进程最近常常失败。请过一会再尝试此请求的解决方法
错误信息如图所示: 应用程序“PIAOYUN.CC”中的服务器错误Internet Information Services 7.5 错误摘要HTTP 错误 500.0 - Internal Serv ...
- nginx服务器下 PHP 出现 502 解决方案(转)
nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端PHP-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题 ...
- 谱聚类(Spectral clustering)(1):RatioCut
作者:桂. 时间:2017-04-13 19:14:48 链接:http://www.cnblogs.com/xingshansi/p/6702174.html 声明:本文大部分内容来自:刘建平Pi ...
- jvisualvm工具使用
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe). https:// ...
- EXCEL多列名称组合成一列名称
- python学习之itsdangerous模块
类 from itsdangerous import URLSafeTimedSerializer as ustsr class ustsr(secret_key) 参数: secret_key可以是 ...
- 提取ipa里面的资源图片 png
Apple 对 iPhone 应用程序中的 png 图片进行了特殊的处理,在 png 文件头之后加了一个非标准的 CgBI 数据段,IDAT 段图像数据也没有传统的压缩数据头和尾,并且红色和蓝色是反的 ...
- oracle中用SQL语句创建和管理表
表名和列名的命名规则: 必须以字母开头 必须在1-30个字符之间 只能包含A-Z,a-z,0-9,_,$,# 不能与用户定义的其它对象重名 不能使用ORACLE的保留字 创建前具备的条件: CREAT ...