《Java 8 函数式编程》笔记1

前记

在图书馆找有关 Java 的书时发现了这本动物出版社的书,大一时就听过 lambda,匿名函数之类的了(虽然两者不同),一直没机会接触前者,鉴于前段时间写的程序有好多匿名函数,很是冗余,本着好奇以及打算重构的心,就借来这本书打算学习一遍 lambda。本笔记按照章节顺序从第 2 章开始。

纸质书读起来很有滋味,建议买来或借来品味一番。

随书的资料在作者的 github 中可以下载到。

本笔记代码也全部放在 github 中,建议搭配代码食用~

Read more

《Java 8 函数式编程》笔记3

类库

默认方法

Collection 接口中新增了 stream 方法,如果继承它的子类没有实现 stream 方法,就使用它的 stream 方法,这样的方法叫默认方法。

Iterable 接口中也新增了一个默认方法:forEach,允许用户使用 lambda 表达式作为循环体。

JDKforEach 的实现方法:

Read more

《Java 8 函数式编程》笔记4

高级集合类和收集器

方法引用

标准语法:Classname::methodName

比如想得到艺术家的名字:

1
2
3
4
5
lambda:artist -> artist.getName()

方法引用:Artist::getName

Arrays.stream(artist).map(Artist::getName).forEach(System.out::println)

构造方法同样可以缩写:

1
2
3
lambda:(name, nationality) -> new Artist(name, nationality)

方法引用:Artist::new
Read more

《Java 8 函数式编程》笔记5

数据并行化

并行和并发

并行:两个任务在同一时间发生,比如在多核 CPU 上,A 任务在三核,B 任务在四核。
并发:两个任务共享时间段,比如在 1s 内 A 任务和 B 任务交替运行 0.5s。

并行化流操作

在一个 Stream 对象上调用 parallel 方法即可拥有并行操作的能力。
如果想从一个集合类创建一个流,调用 parallelStream 即可获得拥有并行能力的流。

Read more

《Java 8 函数式编程》笔记6

测试、调试和重构

孤独的覆盖

ThreadLocal 能创建一个工厂,为每个线程最多只产生一个值。这是确保非线程安全的类在并发环境下安全使用的一种简单方式。

假设要在数据库查询一个艺术家,但希望每个线程值做一次这种查询:

1
2
3
4
5
6
ThreadLocal<Album> thisAlbum = new ThreadLocal<Album>() {
@Override
protected Album initialValue() {
return database.findCurrentAlbum();
}
};

为工厂方法 withInitial 传入一个 Supplier 对象实例来创建对象:

1
2
3
ThreadLocal<Album> thisAlbum = ThreadLocal.withInitial(
() -> database.findCurrentAlbum()
);
Read more

《Java 8 函数式编程》笔记7

设计和架构的原则

命令者模式

命令者是一个对象,它封装了调用另一个方法的所有细节,命令者模式使用该对象,可以编写出根据运行期条件,顺序调用方法的一般化代码。

命令者模式中有四个类参与其中:

命令接收者
执行实际任务

命令者
封装了所有调用命令执行者的信息

发起者
控制一个或多个命令的顺序和执行

客户端
创建具体的命令者实例

Read more