第一章 为什么要关心Java8
1.1 Java怎么还在变
因为人们一直在追求完美的编程语言
1.1.1 Java在编程语言生态系统中的位置
Java 8对于程序员的主要好处在于它提供了更多的编程工具和概念,能以更快,更重要的是能以更为简洁、更易于维护的方式解决新的或现有的编程问题。
1.1.2 流处理
第一个编程概念是流处理,流是一系列数据项,一次只生成一项,一个程序的输出流很可能是另一个程序的输入流。 Java8在java.util.stream中添加了一个Stream API,推动这种做法的一个好处是在一个更高的抽象层次上写Java 8程序了,另一个好处是,Java8可以透明地把输入的不相关部分拿到几个CPU内核上去分别执行Stream操作流水线,几乎是免费的并行,用不着费劲搞Thread。
1.1.3 用行为参数化把代码传递给方法
Java8中增加的另一个编程概念是通过API来传递代码的能力
1.1.4 并行和并享的可变数据
没有共享的可变数据,将方法和函数即代码传递给其他方法的能力是函数式编程范式的基石,而命令式编程范式中,写的程序则是一系列改变状态的指令。
1.1.5 Java需要演变
语言需要不断改进以跟进硬件的更新或满足程序员的期待。
1.2 Java中的函数
编程语言中的函数一词通常是指方法,对象、原始值被称为一等公民,而方法和类被称为二等公民,在Java8在运行时传递方法将方法变成一等公民。
1.2.1 方法和Lambda作为一等公民
Java 8之前,需要筛选一个目录中的所有隐藏文件
File [] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
});
在Java8之后,将代码重写为
File [] hiddenFiles = new File(".").listFiles(File::isHidden);
1.2.2 传递代码:一个例子
public interface Predicate<T> {
boolean test(T t);
}
public static List<Apple> filterApples(List<Apple> inventory,Predicate<Apple> p) {
}
前者希望接受一个类参数,后者的代码传递了方法Apple::isGreenApple来执行。
1.2.3 从传递方法到Lambda
为了只用一两次的短方法去写一堆定义有些烦人,因此可以引入Lambda,代码更干净,更清晰。
filterApples(inventory,(Apple a) -> "green".equals(a.getColor()) );
1.3 流
Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算,Stream允许并提倡并行处理一个Stream中的元素流提供的几乎免费的并行,只有在传递给filter之类的库方法的方法不会互动时才能工作。
1.4 默认方法
Java 8中加入默认方法主要是为了支持库设计师,让他们能够写出更容易改进的接口,Java 8在接口声明中使用新的default关键字来表示这一点。
1.5 来自函数式编程的其他好思想
第一个是Optional类来避免出现NullPointer异常。第二个是模式匹配,函数式编程。
1.6 小结
以下是你应从本章中学到的关键概念。 请记住语言生态系统的思想,以及语言面临的“要么改变,要么衰亡”的压力。Java 8中新增的核心内容提供了令人激动的新概念和功能,方便我们编写既有效又简洁的程序。现有的Java编程实践并不能很好地利用多核处理器。函数是一等值;记得方法如何作为函数式值来传递,还有Lambda是怎样写的。Java 8中Streams的概念使得Collections的许多方面得以推广,让代码更为易读,并允许并行处理流元素。你可以在接口中使用默认方法,在实现类没有实现方法时提供方法内容。其他来自函数式编程的有趣思想,包括处理null和使用模式匹配。