1.java8优势
通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行。

2.函数式编程的核心
使用不可变值和函数,函数对一个值进行处理,映射成另一个值。

3.Lambda表达式
一种紧凑的、传递行为的方式。

4. 静态类型语言
java8依旧是静态类型语言,javac依旧会在编译时,对参数类型进行检查。

5.函数接口
只有一个抽象方法的接口,用作lamdba表达式的类型。

6.对核心类库的改进-Stream
实现机制
整个过程:一系列惰性求值方法+最后一个及早求值方法
常用流操作

collect
及早求值的方法,用于生成list,set,map。
map
将一个流中的值转化为一个新的流,对应的业务逻辑是:有一个函数需要将一种类型的值转为另一种类型。
filter
遍历数据并检查其中的元素,过滤掉不符合条件的元素。接受一个Predicate接口
flatmap
可用Stream替换值,然后将多个Stream连接成一个Stream
例如:List together=Stream.of(list1,list2,…,listn).flatMap(num->num.stream()).collect(Collectors.toList());
max和min
参数:参数为排序指标
格式:xx.stream().max(Comparator.comparing(…)).get();
reduce
从一组值生成一个值
例如count(),sum()等
使用方法有两种形式
有初始值
无初始值
返回对象:Optional对象
如果code想要并行化,则reduce操作有2个限制
初值必须为组合函数的恒等值
组合操作必须符合结合律
Stream迭代的优势

利用Stream进行迭代,使得迭代过程从外部迭代 转为 内部迭代。
外部迭代缺点:
本质上,属于串行化操作
7. 对核心类库的改进-集合类API
形式上:引入default方法和接口的static方法
基本类型的改变:
只包括:Integer,Long,Double共计3种,因为这3种在数值计算中使用的最多。
Stream类的某些方法对基本类型和装箱类型进行了区分,目的是减少装箱拆箱的性能开销。
default方法出现的意义
实现了库接口的自定义类,在库接口添加新方法时,可以在不改变客户端自定义类的情况下,使得自定义类正常运行。因为新添加的方法类型为default,这样自定义的类虽然没有实现这个接口方法,但是自动拥有了这个方法,因为库接口提供了这个方法的默认实现。
Optional新增数据类型
功能:
用于替换null
使用Optional的目的
Optional对象鼓励程序员适时检查变量是否为空。
它将一个类的API中可能为空的值文档化,更适合阅读。
8.数据并行化
数据并行化的必要性
多核CPU的出现,需要通过并行化的code来提升现有代码的计算能力,而不再依赖提升CPU的时钟频率。
阿姆达尔定律
预测了搭载多核CPU的机器提升速度的理论最大值。例如,如果将一段完全串行化的code,一半改为并行化处理,则CPU>=2的所有情况中,理论上最大速度都是原来的2倍。因此,可以得出结论,问题的求解时间,完全取决于:问题可以被分解为几个部分
影响并行流性能的5个因素
数据大小。因为涉及到数据分解、合并的开销。
源数据结构。因为这涉及数据分割的开销。
装箱。
核的数量。这里核的数量是指:运行时,机器能使用的核的数量,而不是机器上有多少核。
单元处理开销。单元处理开销时间越长,并行操作带来的性能提升越明显。
核心类库的通用数据结构分类
分类标准
长度是否确定,结构是否复杂两方面考虑。
性能好(长度确定,线性结构)
如ArrayList,数组,Intstream.range等。支持随机读取,易分解。
性能一般(结构复杂,tree/hash类型)
如HashSet,TreeSet等,不易公平分解。
性能差(长度不定)
如LinkedList,分解时间复杂度为:O(N)。
java8对数组新增的并行化操作方法
Arrays.parallelPrefix,计算数组的和
Arrays.parallelSetAll,更新数组元素
Arrays.parallelSort,对数组元素排序

Java8函数式编程的宏观总结的更多相关文章

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

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

  2. Java8 函数式编程详解

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

  3. Java8函数式编程探秘

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

  4. [2017.02.23] Java8 函数式编程

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

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

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

  6. 漫漫人生路,学点Jakarta基础-Java8函数式编程

    接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...

  7. java8函数式编程实例

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

  8. Java8函数式编程以及Lambda表达式

    第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...

  9. 重识Java8函数式编程

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

随机推荐

  1. interface Part1(接口详解)

    1. 在日常生活中,手机.笔记本电脑.平板电脑等电子产品提供了不同类型的接口用于充电或者连接不同的设备. 不同类型接口的标准不一样,例如电压.尺寸等. 2. 在C#语言中,接口也会定义一种标准,如果需 ...

  2. 自己用ansible加shell 写的自动安装kubernetes的脚本

    脚本地址:https://github.com/shatianxiaozi/auto_install_k8s.git 1. 下载 git clone https://github.com/shatia ...

  3. angular.module 详解

    AngularJS 模块 模块包含了主要的应用代码. 一个应用可以包含多个模块,每一个模块都包含了定义具体功能的代码. 可以将module理解成一个容器,可以往其中放入controllers.serv ...

  4. Android笔记(十二)AndroidManiFest.xml

    AndroidManiFest.xml清单文件是每个Android项目所必须的,它是整个Android应用的全局描述文件.AndroidManiFest.xml清单文件说明了该应用的名称.所使用的图标 ...

  5. Django组件之forms

    forms:校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_len ...

  6. Linux 命令之 ln

    ln 的作用是制作一个文件或者目录的快捷方式,让我们在使用的过程当中更加方便地使用. 下面我来简单介绍一下 ln 的基本用法. ln 的基本语法 生成一个软链 ln -s source_name li ...

  7. Windows——系统盘重置密码

    一.制作好系统启动U盘 软碟通自己制作即可 二.这进入到安装前界面按Shift+F10调出命令提示符 三.输入regedit后按回车进入注册表编辑器 四. 左键单击选中HKEY_LOCAL_MACHI ...

  8. uWSGI ,WSGI和uwsgi的区别

    1.1.为方便理解,uWSGI ,WSGI和uwsgi在网站项目流程图中的功能如下: 1.2.网站项目结构图 2.uWSGI ,WSGI和uwsgi的区别 2.1 WSGI: WSGI,全称 Web ...

  9. SignalR 初体验

    目录 一.前言 二.服务端 2.1.站点服务端 2.2.宿主服务或客户端 2.3.持久连接和集线器 三.客户端 3.1.使用代理客户端 3.2.不使用代理客户端 一.前言 微软官方给的说明:ASP.N ...

  10. Oracle递归查询connect by

    一.概述 Oracle中可以通过START WITH . . . CONNECT BY . . .子句来实现SQL的层次查询. 自从Oracle 9i开始,可以通过 SYS_CONNECT_BY_PA ...