参考https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

LTS版本

1 lambda函数式编程


可以看出,lambda表达式由三部分组成:

  • 参数列表:主体需要的参数
  • 箭头:把参数和主体分隔开
  • lambda主体

    四个函数接口

在java8中提供很多函数式接口,

Function<T, R> 接收一个T类型参数,返回R类型的结果的方法抽象,通过调用apply(T t)方法执行内容

Consumer 接收一个参数,没有返回值,可以理解将这个参数”消费“了,使用accept(T t)对参数执行行为

Supplier 和Consumer相反,不接收参数,但是提供一个返回值,使用get()方法获得这个返回值

Predicate 谓语接口,“是”或者“不是”,接收一个参数,返回一个Boolean类型值,多用于判断和过滤,可以理解为特殊的Function,使用test(T t)执行这段行为

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

在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法);所有实现或继承该接口的类都自动拥有该方法

接口里可以声明静态方法,并且可以实现。

3 stream API

集合是Java中使用最多的API,如果没有集合我们开发的效率就会降低很多。Java 8在对集合的处理引入了stream的概念,stream允许你以声明性方式处理数据集合。就现在来说,你可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码。任何集合类都可以转换成stream,然后应用java 8提供的内置函数(比如filter,match,map等)来实现我们的业务逻辑。

4 java.time

在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些原因未知的 设计决策,这个类的易用性被深深地损害了,比如:年份的起始选择是1900年,月份的起始从0 开始。

在Java 1.1中,Date类中的很多方法被废弃了,取而代之的是java.util.Calendar类。Calendar类也有类似的问题和设计缺陷,导致使用这些方法写出的代码非常容易出错。比如,月份依旧是从0开始计算(不过,至少Calendar 类拿掉了由1900年开始计算年份这一设计)。更糟的是,同时存在Date和Calendar这两个类, 也增加了程序员的困惑。

所以,Java 8之前的库对日期和时间的支持就非常不理想,java 8引入了新的日期时间java.time包来解决之前jdk版本中日期时间的操作问题。

Clock

Clock类使用时区来返回当前的纳秒时间和日期。Clock可以替代System.currentTimeMillis()和TimeZone.getDefault()。

打印输出及解析日期时间对象

处理日期和时间对象时,格式化以及解析日期时间对象是另一个非常重要的功能。新的java.time.format包就是特别为这个目的而设计的。

和java.util.DateFormat相比较,所有的DateTimeFormatter实例都是线程安全的。所以,能够以单例模式创建格式器实例,就像DateTimeFormatter所定义的那些常量, 并能在多个线程间共享这些实例。

JVM的新特性

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

Hashmap

数组+链表–>红黑树实现

留言

2018-01-05