Java8的新特性
-
- 一、函数式接口
- 二、Lambda表达式
-
- 1、Lambda作用
- 2、语法
- 3、Lambda表达式的六种使用
-
- 3.1、抽象方法:无参、无返回值
- 3.2、抽象方法:需要传一个参数、无返回值
- 3.3、抽象方法:需要传一个参数(类型省略,编译器自动推断)、无返回值
- 3.4、抽象方法:只有一个参数时,形参的小括号可以省略、无返回值
- 3.5、抽象方法:有两个或以上的参数,多条执行语句,并且有返回值
- [3.6、抽象方法:Lambda体只有一条语句时, return和大括号都可以省略](#3.6、抽象方法:Lambda体只有一条语句时, return和大括号都可以省略)
- 三、方法引用/构造器引用/数组引用
- [四、Stream API](#四、Stream API)
- 五、接口的增强
- 六、Optional类
- 七、新的时间和日期API
- 八、其他特性
-
- 1、重复注解
- 2、类型注解
- 3、通用目标类型推断
- 4、JDK的更新
-
- 4.1、集合的流式操作
- 4.2、并发
- 4.3、Arrays
- 4.4、Number和Math
- 4.5、IO/NIO的改进
- 4.6、Reflection获取形参名
- [4.7、String: join()](#4.7、String: join())
- 4.8、Files
- 5、新编译工具:jjs、jdeps
- 6、JVM中的Metaspace取代PermGen空间
一、函数式接口
函数式接口 有且仅有一个抽象方法
1、Java内置的函数式接口
java
// Function<T, R> -T作为输入,返回的R作为输出
Function<String,String> fun = (x) -> {return "Function";};
System.out.println(fun.apply("hello world")); // 输出: Function
//Predicate<T> -T作为输入,返回的boolean值作为输出
Predicate<String> pre = (x) ->{System.out.print(x);return false;};
System.out.println(": "+pre.test("hello World")); // hello World: false
//Consumer<T> - T作为输入,执行某种动作但没有返回值
Consumer<String> con = (x) -> {System.out.println(x);};
con.accept("hello world"); // hello world
//Supplier<T> - 没有任何输入,返回T
Supplier<String> supp = () -> {return "Supplier";};
System.out.println(supp.get()); // Supplier
//BinaryOperator<T> -两个T作为输入,返回一个T作为输出,对于"reduce"操作很有用
BinaryOperator<String> bina = (x,y) ->{System.out.print(x+" "+y);return "BinaryOperator";};
System.out.println(" "+bina.apply("hello ","world"));
二、Lambda表达式
Lambda表达式的本质: 作为函数式接口的实例对象【接口的匿名实现】,本质是一个匿名函数。
Lambda表达式对应的编译类型: 1、接口; 2、且该接口有且仅有一个抽象方法 即是(函数式接口)
1、Lambda作用
- 简写接口的匿名内部类的写法
2、语法
java
ArrayList<Integer> list = new ArrayList<>(); // 类型推到,运行类型的<>省略类型
list.add(1);
list.add(2);
list.add(3);
/**
* (o1, o2) -> Integer.compare(o2, o1)
* -> 表示Lambda操作符或者箭头操作符
* -> 左边:Lambda形参列表(即:匿名内部类重新方法的形参列表)
* -> 右边:Lambda体 (即:重写的抽象方法的方法体)
*/
list.sort((o1, o2) -> Integer.compare(o2, o1));
System.out.println(list);
3、Lambda表达式的六种使用
3.1、抽象方法:无参、无返回值
java
Runnable r = () -> System.out.println("Runnable中的run方法被重写了");
r.run();
3.2、抽象方法:需要传一个参数、无返回值
java
Consumer<String> con = (String s) -> System.out.println(s);
con.accept("Test");
3.3、抽象方法:需要传一个参数(类型省略,编译器自动推断)、无返回值
java
Consumer<String> con = (s) -> System.out.println(s);
con.accept("Test");
3.4、抽象方法:只有一个参数时,形参的小括号可以省略、无返回值
java
Consumer<String> con = s -> System.out.println(s);
con.accept("Test");
3.5、抽象方法:有两个或以上的参数,多条执行语句,并且有返回值
java
Comparator<Integer> com = (o1, o2) -> {
System.out.println("line one");
return o1 - o2;
};
3.6、抽象方法:Lambda体只有一条语句时, return和大括号都可以省略
java
Comparator<Integer> com = (o1, o2) -> o1 - o2;
com.compare(12, 6);
三、方法引用/构造器引用/数组引用
方法引用其实就是Lambda表达式的语法糖。
1、方法引用的使用前提:
重写的抽象方法的形参列表和返回值类型与Lambda体方法引用的方法的形参列表和返回值类型相同。
2、Lambda语法糖的写法
- 对象 :: 非静态方法/实例方法名
- 类 :: 静态方法名
- 类 :: 非静态方法名