前言

越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和 JVM 等方面的十多个新特性。在本文中我们将学习这些新特性,并用实际的例子说明在什么场景下适合使用。

引用:本文参考了这两篇文章,加以自己的理解,整理成一份最容易理解的 Java8 新特性文章,有少部分章节可能内容一致,但绝对不是抄袭,只是为了文章的完整性,大部分常用的地方加了我自己的理解和示例。

https://blog.csdn.net/yczz/article/details/50896975

https://blog.csdn.net/maosijunzi/article/details/38658095

适合读者及目标

目标人群

  • 适合有用过 lambda 表达式的同学,想彻底了解清楚
  • 学习 Java8 的新特定

目标

  • 了解 java8 的函数式接口和 Lambda 表达式
  • 方法引用的使用
  • 接口的静态方法和默认方法
  • Date/Time Api 的使用
  • Stream API 的使用

1. Java 语言的新特性

Java8 的 lambda 的使用确实方便了许多,但也使初次了解的人感觉到难以阅读,其实是你不习惯的原因。很多语言从一开始就支持了 Lambda 表达式,像 Groovy,Scala 等。

1.1 Lambda 表达式和函数式接口

在 Java8 以前,我们想要让一个方法可以与用户进行交互,比如说使用方法内的局部变量;这时候就只能使用接口做为参数,让用户实现这个接口或使用匿名内部类的形式,把局部变量通过接口方法传给用户。

传统匿名内部类缺点:代码臃肿,难以阅读

Lambda 表达式

Lambda 表达式将函数当成参数传递给某个方法,或者把代码本身当作数据处理;

语法格式:

  • 用逗号分隔的参数列表
  • -> 符号
  • 和 语句块 组成
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

等价于

List<String> list = Arrays.asList( "a", "b", "d" ); for(String e:list){     System.out.println(e); }

如果语句块比较复杂,使用 {} 包起来

Arrays.asList( "a", "b", "d" ).forEach( e -> {     String m = "9420 "+e;     System.out.print( m ); });

Lambda 本质上是匿名内部类的改装,所以它使用到的变量都会隐式的转成 final 的

String separator = ","; Arrays.asList( "a", "b", "d" ).forEach(      e -> System.out.print( e + separator ) );

等价于

final String separator = ","; Arrays.asList( "a", "b", "d" ).forEach(      e -> System.out.print( e + separator ) );

Lambda 的返回值和参数类型由编译器推理得出,不需要显示定义,如果只有一行代码可以不写 return 语句

Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );

等价于

List<String> list = Arrays.asList("a", "b", "c"); Collections.sort(list, new Comparator<String>() {     @Override