1. 外部迭代

1.1. for循环是一个封装了迭代的语法糖

1.1.1. 本质上来讲是一种串行化操作

1.2. 很难抽象出不同操作

2. 内部迭代

2.1. 内部迭代中的相应接口:Stream

2.2. 和Iterator类似,Stream是一种内部迭代方式

2.3. 内部迭代将更多控制权交给了集合类

3. Stream

3.1. 理想方式

3.1.1. 形成一个惰性求值的链,最后用一个及早求值的操作返回想要的结果

3.2. Stream工厂是更好的选择

3.2.1. 仅暴露一个Stream接口,都不会影响内部的List或Set

3.3. 用函数式编程方式在集合类上进行复杂操作的工具

3.4. 惰性求值方法

3.4.1. 最终不产生新集合的方法

3.5. 及早求值方法

3.5.1. 最终会从Stream产生值的方法

3.6. 判断标准

3.6.1. 返回值是Stream

3.6.2. 返回值是另一个值或为空

4. 常用的流操作

4.1. of方法

4.1.1. 使用一组初始值生成新的Stream

4.2. collect(toList())方法

4.2.1. 由Stream里的值生成一个列表

4.2.2. 一个及早求值操作

4.3. map

4.3.1. 将一个流中的值转换成一个新的流

4.3.2. 一个函数可以将一种类型的值转换成另外一种类型

4.3.3. 参数和返回值不必属于同一种类型

4.3.4. 必须是Function接口的一个实例

4.3.4.1. Function接口是只包含一个参数的普通函数接口

4.4. flatMap

4.4.1. 可用Stream替换值,然后将多个Stream连接成一个Stream

4.4.2. 调用stream方法,将每个列表转换成Stream对象,其余部分由flatMap方法处理

4.4.3. Function接口

4.4.3.1. 方法的返回值限定为Stream类型

4.5. filter

4.5.1. 遍历数据并检查其中的元素

4.5.2. 值为true的元素被保留下来

4.5.3. Predicate接口

4.6. reduce

4.6.1. 实现从一组值中生成一个值

4.6.2. count方法

4.6.3. max和min

4.6.3.1. 返回Optional对象

4.6.3.1.1. 代表一个可能存在也可能不存在的值

4.6.3.2. Comparator对象

4.6.3.2.1. 静态方法comparing
4.6.3.2.2. 有且只有一个抽象方法
4.6.3.2.3. 实际上是一个函数接口

5. 多次调用流操作缺点

5.1. 代码可读性差,样板代码太多,隐藏了真正的业务逻辑

5.2. 效率差,每一步都要对流及早求值,生成新的集合

5.3. 代码充斥一堆垃圾变量,它们只用来保存中间结果

5.4. 难于自动并行化处理

6. 高阶函数

6.1. 接受另外一个函数作为参数,或返回一个函数的函数

6.2. 函数的参数列表里包含函数接口,或该函数返回一个函数接口

6.3. 没有副作用的函数不会改变程序或外界的状态

6.3.1. 给变量赋值是一种副作用

6.3.2. 向控制台输出了信息是一种副作用

6.3.3. 获取值使用户更容易写出没有副作用的代码

6.3.4. Lambda表达式传给Stream上的高阶函数,都应该尽量避免副作用

6.3.5. 唯一的例外是forEach方法,它是一个终结方法

读Java8函数式编程笔记02_流的更多相关文章

  1. Java8函数式编程探秘

    引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...

  2. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  3. 关于Java8函数式编程你需要了解的几点

    函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...

  4. Java8 函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  5. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  6. java8函数式编程(转载)

    1. 概述 1.1 函数式编程简介 我们最常用的面向对象编程(Java)属于命令式编程(Imperative Programming)这种编程范式.常见的编程范式还有逻辑式编程(Logic Progr ...

  7. Java8函数式编程的宏观总结

    1.java8优势通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行. 2.函数式编程的核心使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 3. ...

  8. java8函数式编程实例

    什么是函数式编程 函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法.别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”. Stream 说到函数式编程,就不得 ...

  9. 重识Java8函数式编程

    前言 最近真的是太忙忙忙忙忙了,很久没有更新文章了.最近工作中看到了几段关于函数式编程的代码,但是有点费解,于是就准备总结一下函数式编程.很多东西很简单,但是如果不总结,可能会被它的各种变体所困扰.接 ...

  10. [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

    Stream的概念定义   官方文档是永远的圣经~     表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.s ...

随机推荐

  1. Codeforces Round #802 (Div. 2)C. Helping the Nature(差分)

    题目链接 题目大意: 给你一个有n个元素的数组a,你可以通过一下三种操作使数组的每一个值都为0: 选择一个下标i,然后让a[1],a[2]....a[ i ] 都减一; 选择一个下标i,然后让a[i] ...

  2. SpringCloud(九) - Nginx

    1.安装Nginx 1.1 解压上传安装包 解压# nginx-1.16.1.tar.gz # nginx需要一些环境(全部执行,不存在的会执行,存在的会跳过) yum install -y wget ...

  3. 833(DIV2)——C题题解

    题目链接 题目大意: 给定n个数,你可以对数值为0的数改变其为任意值,问最后前缀和为0的个数的最大值. 思路: 这题比较可惜,自己的思路没有问题,但是他少了一些东西.对数组进行前缀和处理,我们可以发现 ...

  4. SolidEdge ST8安装教程

    SolidEdge ST8安装教程: 1.使用百度云客户端下载Solidedge ST8软件安装包,打开软件安装文件夹: 2.选择.ISO安装文件,打开.ISO安装文件,可以解压或使用虚拟光驱加载: ...

  5. 5、有一行电文,译码规律为: a ——> z b——> y c ——> x. 即把第一个字母变成第26个字母, 第i个字母变成第(26-i+1)个字母, 非字母字符不变

    /* 有一行电文,译码规律为: a --> z b--> y c --> x. 即把第一个字母变成第26个字母, 第i个字母变成第(26-i+1)个字母, 非字母字符不变 */ #i ...

  6. VM安装Centos7操作系统

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 视频教程:https://live.csdn.ne ...

  7. 深度学习之Tensorflow入门

    声明 本文参考[中文][吴恩达课后编程作业]Course 2 - 改善深层神经网络 - 第三周作业_何宽的博客-CSDN博客我对这篇博客加上自己的理解,力求看懂 本文所使用的资料已上传到百度网盘[点击 ...

  8. 篇(16)-Asp.Net Core入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二)

    入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二) (1).在用户管理着模块中,相比较菜单功能的代码还是比较多的,设计到用户的创建,修改,角色变更和密码重置,同时都集中在列表 ...

  9. Vue使用Element表单校验错误Cannot read property ‘validate’ of undefined

    在做注册用户的页面使用表单校验一直提示Cannot read property 'validate' of undefined错误,其实这个错误的提示根据有多种情况,比较常见的就是 ref 的名字不一 ...

  10. VR技术名词解释

    视觉相关技术 分辨率 分辨率(resolution)就是屏幕图像的精密度,是指显示器所能显示的像素的多少.由于屏幕上的点.线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内 ...