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

一、基础知识

第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章 通过行为参数化传递代码

示例:

public static boolean isGreenApple(Apple apple) {
return "green".equals(apple.getColor());
} //java.util.function中有这个接口
public interface Predicate<T> {
boolean test(T t);
} static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory){
if (p.test(apple)) {
result.add(apple);
}
}
return result;
} //使用时:
filterApples(inventory, Apple::isGreenApple);

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

第3章 Lambda 表达式

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

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

//无装箱操作(推荐)
IntPredicate evenNumbers = (int i) -> i % 2 == 0;
evenNumbers.test(1000); //装箱
Predicate<Integer> oddNumbers = (Integer i) -> i % 2 == 1;
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. 使用BaGet来管理内部Nuget包

    有的时候,我们想要制作一些nuget包,供自己内部调用,不想公开出去,那么就需要一个能够集中管理nuget包的服务了,今天我来给大家介绍一款轻便好用的包管理服务-----BaGet 下载并部署BaGe ...

  2. Linux基础之输入输出

    第十五章 输入输出 一.重定向概述 1.1.什么是重定向? 将原本要输出到屏幕的数据信息,重新定向到指定的文件中. 比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中.这样第二天通过查看 ...

  3. opencv windows源码编译

    WITH_QT//H:\software\programming\qt\5.12.3\mingw73_32\lib\cmake  5.6的路径要改这样 WITH_OPENGL 编译器mingw32-m ...

  4. robotframework关键字

    *** Settings ***Library Selenium2Library *** Keywords ***Checkbox应该不被选择 [Arguments] ${locator} Check ...

  5. zabbix邮件报警通过脚本来发送邮件

    zabbix默认邮件报警会将各个报警接收人单独发送邮件,为了使邮件能以群发的方式统一一封邮件发送所有接收人,需要改成脚本的形式: sendemail.py: #!/usr/bin/python imp ...

  6. python其他篇(1)

    1.跳过anaconda直接打开spyder或qtconsole: 打开终端,输入spyder或者jupyter-qtconsole 2.conda安装jpype1和pyhanlp: 参考:http: ...

  7. @ContrllerAdvice全局异常

    @ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理.最常用的 ...

  8. 108天南京银行完成不可能完成的新金融DevOps转型

    在2018云栖大会南京峰会企业研发云专场,由南京银行研发管理负责人吴攀带来了“云效助力新金融DevOps转型——南京银行实践之路”的主题分享.首先对南京银行的研发规模与成长做了介绍,对“鑫云+”的诞生 ...

  9. Python3解leetcode Average of Levels in Binary Tree

    问题描述: Given a non-empty binary tree, return the average value of the nodes on each level in the form ...

  10. Incorporating ASP.NET MVC and SQL Server Reporting Services, Part 2

    In the last issue, I introduced you to the basics of incorporating SQL Server Reporting Services int ...