写给大忙人的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)。

时间: 2024-10-15 14:30:30

写给大忙人的JavaSE 8 - 学习的相关文章

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

《写给大忙人的Hadoop 》读书笔记(二)Hadoop介绍

本文从Hadoop是什么.能做什么.谁使用三个主要问题去讲解.对于重点知识如MapReduce.YARN.Hadoop生态系统内的其他组件(HBase.Pig.Hive.Zookeeper等)的介绍和使用这里不做详细说明,需要大家对这些内容扩展并深入学习. 1.Hadoop是什么及功能 1.2002年,Hadoop作为一个支持Web搜索引擎的单独软件项目被创立,如今已成为一个用来分析大量不同类型数据的工具和应用程序(如HBase,Hive等)的生态系统. Hadoop数据处理的一些功能如下: 1

JavaSE入门学习45:文件传输基础之I/O流(四)

五字符流的使用 (1)编码问题 这个问题我们早就说过了,不再过多赘述. 参考:JavaSE入门学习42:文件传输基础之I/O流(一) (2)认识文本和文本文件 Java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码):而文件是byte byte byte ...的数据 :文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk等)序列化为byte的存储结果. (3)字符流(Reader Writer)---->操作的是文本文本文件 字符的

写给大忙人看的Swift——互动出版网

这篇是计算机类的优质预售推荐>>>><写给大忙人看的Swift> 编辑推荐 本书适合各种层次的Swift 学习者和开发者阅读,包括拥有 Objective-C 开发经验的开发者,想要用 Swift 编写程序的爱好者等任何对 Swift 感兴趣的人.对于想要快速了解和掌握Swift 的人来说,<写给大忙人看的Swift>是一本不可多得的枕边读物. 内容简介 本书全面介绍了苹果公司新推出的 Swift 编程语言.主要内容包括 Swift 语法简介,Swift 应

JavaSE入门学习24:Java面向对象补充

一Java中的Object类 Object类是所有Java类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认 继承Object类. public class Person{ // } //等价于 public class Person extends Object{ // } Object类中的方法,适合所有子类. 1)toString()方法 在Object类中定义有public String toString()方法,其返回值是String类型,描述当前对

JavaSE入门学习7:Java基础语法之语句(下)

继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for. (5)Java循环语句之while 语法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 运行

《写给大忙人看的java se 8》笔记

现在才来了解java8,是不是后知后觉了点? 新的编程技术,个人不喜欢第一时间跟进. 待社区已有实践积淀再切入似乎更划算些? 一点点精明的考虑. 不多说,上代码. //读<写给大忙人看的java se 8>做的笔记代码 //希望对忙到连这书都没工夫看的你,匆匆一瞥,留下印象 //祝编程愉快 public class MainTest { //第一章,讲lambda表达式 //lambda表达式类似javascript的函数字面量,可用于替代java的匿名内部类 //基本型为 (形参列表)-&g

写测试感悟,获取软件测试学习视频资料

大家好,我是TT,互联网测试行业多年,没有牛逼的背景,也没有什么可炫耀的,唯独比他人更努力,在职场打拼.遇到过的坑,走过的弯路,愿意与大家分享,分享自己的经验,少走弯路.首发于个人公众号[测试架构师] 原文如下: 今天重新系统的整理了一些学习资料,电子书,视频教程等!以活动参与方式发放. 活动规则: 从个人角度,简单聊聊软件测试,自己对软件测试的思考.通过文章底部的评论区留言(微信公众号测试架构师),活动结束将发送给点赞最高的前10名读者.   获取方式有两种: 1.文章底部评论区留言方式,点赞

JavaSE入门学习6:Java基础语法之运算符和语句(上)

继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age的值设置为20.这时候就 须要一个"=",告诉程序须要进行赋值操作. Java 语言中经常使用的运算符可分为例如以下几种:算术运算符,赋值运算符,比較运算符,逻辑运算符,条件运符. (1)算术运算符 算术运算符主要用于进行主要的算术运算.如加法.减法.乘法.除法等. Java 中经常使用的