java8 新特性精心整理(全)
前言
越来越多的项目已经使用 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