从放弃到入门-Java8新特性

549 阅读2分钟

什么是lambda表达式

Lambda 表达式(lambda expression)是一个匿名函数,Lambda 表达式基于数学中的λ演算得名,直接对应于其中的 lambda 抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

Date/Time API日期类

LocalDate和LocalTime和LocalDateTime

并发类

基于新增的lambda表达式和steam特性,为Java 8中为java.util.concurrent.ConcurrentHashMap类添加了新的方法来支持聚焦操作;另外,也为java.util.concurrentForkJoinPool类添加了新的方法来支持通用线程池操作(更多内容可以参考我们的并发编程课程)。
Java 8还添加了新的java.util.concurrent.locks.StampedLock类,用于支持基于容量的锁——该锁有三个模型用于支持读写操作(可以把这个锁当做是java.util.concurrent.locks.ReadWriteLock的替代者)。
在java.util.concurrent.atomic包中也新增了不少工具类,列举如下:
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder

JVM特性

使用Metaspace代替持久代(PermGen space)。在JVM参数方面,使用-XX:MetaSpaceSize和-XX:MaxMetaspaceSize代替原来的-XX:PermSize和-XX:MaxPermSize。

Java8函数式接口

@FunctionalInterface
Predicate<T> 有参数、条件判断
Function<T, R> 有参数、有返回值
Consumer<T> 无返回值
Supplier<T> 无参数、有返回值

Optional

Java应用中最常见的bug就是空值异常。在Java 8之前,Google Guava引入了Optionals类来解决NullPointerException,从而避免源码被各种null检查污染,以便开发者写出更加整洁的代码。Java 8也将Optional加入了官方库。

接口的默认方法和静态方法

Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。默认方法使得开发者可以在不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。
默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。

java8 stream

stream API极大得简化了集合操作。
stream之上的操作可分为中间操作和终止操作。
中间操作会返回一个新的终止操作——执行一个中间操作(例如filter)并不会执行实际的过滤操作,而是创建一个新的终止操作,并将原终止操作中符合条件的元素放入新创建的终止操作。
终止操作(例如forEach或者sum),会遍历终止操作并得出结果或者附带结果;在执行终止操作之后,终止操作处理线已经处理完毕,就不能使用了。在几乎所有情况下,晚期操作都是立刻对终止操作进行遍历。

本文基于网络文章整理