好记性不如烂笔头,整理一些个人觉得比较重要的东西。

一、基础知识

第1章 为什么要关心Java 8

Java 8提供了一个新的API(称为“流”, Stream),它支持许多处理数据的并行操作,其思路
和在数据库查询语言中的思路类似——用更高级的方式表达想要的东西,而由“实现”(在这里
是Streams库)来选择最佳低级执行机制。

Java 8中加入Streams可以看作把另外两项扩充加入Java 8的直接原因:

(1).把代码传递给方法的简洁方式(方法引用、 Lambda)

(2).接口中的默认方法。

Java 8也用Stream API(java.util.stream)解决了这两个问题:集合处理时的套路和晦涩,以及难以利用多核。

Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。

用行为参数化把代码传递给方法:

行为参数化:实现了把方法(你的代码)作为参数传递给另一个方法的能力。

把函数作为一等值。

第2章 通过行为参数化传递代码

示例:

  1. public static boolean isGreenApple(Apple apple) {
  2. return "green".equals(apple.getColor());
  3. }
  4. //java.util.function中有这个接口
  5. public interface Predicate<T> {
  6. boolean test(T t);
  7. }
  8. static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
  9. List<Apple> result = new ArrayList<>();
  10. for (Apple apple: inventory){
  11. if (p.test(apple)) {
  12. result.add(apple);
  13. }
  14. }
  15. return result;
  16. }
  17. //使用时:
  18. filterApples(inventory, Apple::isGreenApple);

以下是你应从本章中学到的关键概念。
     行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们, 完成不同行为的能力。
     行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
     传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java 8之前可以用匿名类来减少。
     Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。

第3章 Lambda 表达式

函数式接口:只定义了一个抽象方法

@FunctionalInterface:用于表示该接口会设计成一个函数式接口。

  1. //无装箱操作(推荐)
  2. IntPredicate evenNumbers = (int i) -> i % 2 == 0;
  3. evenNumbers.test(1000);
  4. //装箱
  5. Predicate<Integer> oddNumbers = (Integer i) -> i % 2 == 1;
  6. oddNumbers.test(1000);

复合Lambda表达式的有用方法:

比较器复合:Comparator.comparing

.reversed()逆序,.thenComparing比较器链

谓词复合:negate()非,and,or

函数复合:.andThen(Function fun),.compose(Function fun)两者顺序相反

以下是你应从本章中学到的关键概念。
     Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常的列表。
     Lambda表达式让你可以简洁地传递代码。
     函数式接口就是仅仅声明了一个抽象方法的接口。
     只有在接受函数式接口的地方才可以使用Lambda表达式。
     Lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例。
     Java 8自带一些常用的函数式接口,放在java.util.function包里,包括Predicate<T>、 Function<T,R>、 Supplier<T>、 Consumer<T>和BinaryOperator<T>,如表3-2所述。
     为了避免装箱操作,对Predicate<T>和Function<T, R>等通用函数式接口的原始类型
特化: IntPredicate、 IntToLongFunction等。

 环绕执行模式(即在方法所必需的代码中间,你需要执行点儿什么操作,比如资源分配和清理)可以配合Lambda提高灵活性和可重用性。
     Lambda表达式所需要代表的类型称为目标类型。
     方法引用让你重复使用现有的方法实现并直接传递它们。
     Comparator、 Predicate和Function等函数式接口都有几个可以用来结合Lambda表达式的默认方法。

Java 8实战之读书笔记二:基础知识的更多相关文章

  1. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...

  2. Java 8实战之读书笔记一:内容简介

    本书的主要内容如下:  如何使用Java 8新增的强大特性  如何编写能有效利用多核架构的程序  重构.测试和调试  怎样高效地应用函数式编程 目录: 第一部分 基础知识 第1 章 为什么要关心Jav ...

  3. Java 8实战之读书笔记三:函数式数据处理

    二.函数式数据处理 第4章 引入流 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现). 示例: import static java.uti ...

  4. Java 8实战之读书笔记四:高效Java 8编程

    三.高效Java 8编程 第8章 重构.测试和调试 Java 8的新特性也可以帮助提升代码的可读性:      使用Java 8,你可以减少冗长的代码,让代码更易于理解      通过方法引用和S ...

  5. 《R实战》读书笔记二

    第一章 R简单介绍 本章概要 1安装R 2理解R语言 3执行R程序 本章所介绍的内容概括例如以下. 一个典型的数据分析步骤如图1所看到的. 图1:典型数据分析步骤 简而言之,现今的数据分析要求我们从多 ...

  6. Java 8实战之读书笔记五:超越Java 8

    四.超越Java 8 第13章 函数式的思考 下面是这一章中你应该掌握的关键概念.      从长远看,减少共享的可变数据结构能帮助你降低维护和调试程序的代价.      函数式编程支持无副作用的 ...

  7. PILE读书笔记_基础知识

    程序的构成 Linux下二进制可执行程序的格式一般为ELF格式. 我们可以用readelf命令来读取二进制的信息. ELF文件的主要内容就是由各个section及symbol表组成的. 下面来分别介绍 ...

  8. UNIX读书笔记----UNIX基础知识

    UNIX体系结构: 从严格意义上讲,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们通常将这种软件称为内核(Kernel),因为他相对较小,而且位于环境的核心.图片显示了UNI ...

  9. 《Java编程思想》读书笔记(二)

    三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...

随机推荐

  1. 12JSP进阶

    1.EL表达式 1.1 简介 EL表达式替代jsp表达式.因为开发jsp页面的时候遵守原则:在jsp页面中尽量少些甚至不写java代码. EL表达式作用:向浏览器输出域对象中的变量或表达式计算的结果 ...

  2. 树——binary-tree-postorder-traversal(树的前序遍历)

    问题: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given bina ...

  3. Windows结束某个端口的进程

    1.打开cmd命令窗口,输入命令:netstat -ano | findstr 8080,根据端口号查找对应的PID.结果如下: 发现8080端口被PID(进程号)为2188的进程占用. 2.根据PI ...

  4. springboot框架中的各种 注解

    使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 2.在配置中也可享受面向对象带来的好处 3.类型安全对重构可以提供良好的支持 4.减少复杂配置文件的同时亦能享受到springI ...

  5. django 多条数据显示的坑(怪自己)

    今天的问题是,一个接口执行了很多次,每次都会在结果表里面记录一条结果信息,在查看接口详情页面,我想只展示一条,然后就进入误区了 第一个是怪自己手残,api_id  被自己写成app_id了 第二个是筛 ...

  6. Jenkins配置git/github 插件的ssh key

    参考来源:http://jingyan.baidu.com/article/a65957f4f0acc624e67f9bc1.html 方式一:本地需要生成公私钥文件,git/github中新建ssh ...

  7. 【leetcode】301. Remove Invalid Parentheses

    题目如下: 解题思路:还是这点经验,对于需要输出整个结果集的题目,对性能要求都不会太高.括号问题的解法也很简单,从头开始遍历输入字符串并对左右括号进行计数,其中出现右括号数量大于左括号数量的情况,表示 ...

  8. 04 全局配置,java 编意默认版本,1.6.修改配置

    https://www.cnblogs.com/liu-s/p/5371289.html <!-- 修改Intellij Idea 创建maven项目默认Java编译版本 --> < ...

  9. elasticsearch-head插件添加安全认证

    elasticsearch-head是集群管理.数据可视化.增删查改.查询语句可视化工具;它可以对数据进行增删查改,对于数据安全来说是有风险的,因此在生产环境中尽量少用,使用该插件至少要限制ip地址或 ...

  10. 13 October

    树链剖分 http://www.lydsy.com/JudgeOnline/problem.php?id=1036 https://oi.men.ci/tree-chain-split-notes/. ...