1.如何学习新特性
-
角度一:新的语法规则
自动装箱、自动拆箱、注解、enum、Lambda表达式等 -
角度二:增加、过时、删除API
StringBuilder、ArrayList、新的日期时间的API、Optional等
-
角度三:底层的优化、JVM参数的调整、GC的变化、内存结构的变化等
注意:初学者一般关注前两个角度即可,第三个角度在项目调优时使用
2.Lambda表达式
(1)小试牛刀
public class LambdaTest1 {
public static void main(String[] args) {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("我爱北京天安门");
}
};
r1.run();
Runnable r2 = () -> {
System.out.println("我爱上海东方明珠");
};
r2.run();
}
}
注:使用Lambda时匿名内部类可以省略掉类名,且Runnable接口只有一个抽象方法,所以也可以省略掉run方法的声明(确定的都可以删了)
public class LambdaTest2 {
public static void main(String[] args) {
System.out.println("普通写法:");
Comparator<Integer> cp1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int n1 = cp1.compare(23,21);
System.out.println(n1);
System.out.println("Lambda表达式:");
Comparator<Integer> cp2 = (o1,o2) -> Integer.compare(o1,o2);
int n2 = cp2.compare(21,23);
System.out.println(n2);
System.out.println("方法引用:");
Comparator<Integer> cp3 = Integer :: compare;
int n3 = cp3.compare(24,13);
System.out.println(n3);
}
}
从上可以得可以使用Lambda表达式的条件:接口只有一个抽象方法
(2)Lambda的格式
-> : Lambda操作符或箭头操作符
->左边 : Lambda形参列表,对应要重写的接口中的抽象方法的形参列表
-> 右边:Lambda体,对应要重写的接口中的抽象方法的方法体
形如:Lambda形参列表 -> Lambda体
(3)Lambda的本质
- 一方面,Lambda作为接口的实现类的对象。
- 另一方面,Lambda表达式是一个匿名函数
(4)Lambda表达式的语法规则总结
-
-> 的左边,Lambda的形参列表,其类型都可以省略,如果只含一个参数,那么()也可以省略
-
-> 的右边,Lambda体,对应着重写的方法体,如果方法体中只有一行执行语句,那么可以省略{},如果加上有return关键字,必须一并省略
示例如下:
Comparator<Integer> cp2 = (o1,o2) -> Integer.compare(o1,o2); int n2 = cp2.compare(21,23);
3.函数式接口
- 如果接口中只声明有一个抽象方法,那么就称这个接口为函数式接口
- 只有给函数式接口提供实现类的对象时,我们才可以使用Lambda表达式
- 四个基本的函数接口
- 消费型接口:Consumer void accept(T t)
- 供给型接口:Supplier T get()
- 函数型接口:Function<T,R> R apply(T t)
- 判断型接口:Predicate boolean test(T t)