(一)为什么关心java8
java8 会让你编写代码更加简单容易,可读性更高,减少模板代码的编写
苹果按重量排序的例子
定义苹果类
@Data
public class Apple {
private int weight;
}
- 传统方式对apples进行排序
Collections.sort(apples, new Comparator<Apple>() {
public int compare(Apple o1, Apple o2) {
return o1.getWeight().compareTo(o2.getWeight());
}
});
- java8方式apples排序
apples.sort(Comparator.comparing(Apple::getWeight));
现在不用关心这段代码具体做什么,后面你会知道它是做什么用的。
lambda 匿名函数
例如:
(int x) -> x + 1
表示调用时给定参数x,就返回x + 1值的函数
lambda和方法做为一等值
java有原始值(比如int),对象,这些可以被操作的值被称为一等值,在程序执行期间可以被传递,而方法,类则不可以被传递,但在java8中将方法,lamda设计为一等值,也可以被传递。
例如筛选一个目录当中所有被隐藏的文件
- 传统方方式
File [] hidenFiles = new File(".").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isHidden();
}
});
事实上file已经有isHidden 方法了,可是我们却得新建一个匿名内部类去处理。
- java8 方式
File [] hidenFiles = new File(".").listFiles(File::isHidden);
在java8 中,直接将isHidden方法当做参数传递过去,只需要使用java8的方法引用符“::”就可以将方法当做值传递过去,这样不仅使得代码更简单,可读性也更高了。
Stream API
Java 8提供了一个新的API(称为“流”,Stream)来处理集合,它支持许多处理数据的并行操作,其思路和在数据库查询语言中的思路类似——用更高级的方式表达想要的东西,而由“实现”(在这里是Streams库)来选择最佳低级执行机制。这样就可以避免用synchronized编写代码。
“流”定义:流是一系列数据项,一次只生成一项,程序可以从输入数据中一个一个读取数据项,然后以同样的方式写入输出流中,一个程序的输出流可能是宁一个程序的输入流,这个有点像linux系统中的管道。
例如:
int sum = IntStream.of(1,2,3,4,5)
.map(x->x+1)
.reduce((x1,x2)->x1+x2).getAsInt();
处理过程就是先取出数组的值,然后+1,最后将所有的值求和。
并行与共享的可变数据
在java8中流的并行是简单的,但是要安全是使用并行流,我们的行为必须是“无状态”或“无副作用”或“无状态”的函数,就像数学函数一样无副作用,所以在java8中强调函数式编程(后面章节介绍),这样使得程序能更加高效安全的并行。
接口中的默认方法
java8中接口的默认方法的出现是为了能够写出更容易改进的接口并向前兼容,因为在java8之前,一旦新增一个接口方法,那么所有的实现类都得实现该方法,而java8中默认方法缺失的方法主体随接口提供了,这就给接口设计者提供了一个扩充接口的方式,而不会破坏现有的代码。Java 8在接口声明
中使用新的default关键字来表示这一点。
Optional
它是一个容器对象,可以包含,也可以不包含一个值,可以屏蔽掉null这种语义不明确,合理的使用它能有的效避免空指针异常。
注:内容参考至《java8实战》扫描下方二维码关注微信公众号,输入java8sz下载电子书。