目录
一 Lambda
1.Lambda
函数式编程思想,方法相当于函数
1.1 匿名内部类写法:
new Thread(new Runable(){
@Override
public void run(){
System.out.println("匿名内部类");
}
}).start
1.2 Lambda表达式
new Thread(()->{System.out.println("lambda表达式");}).start
2.标准格式:离不开接口
2.1 无参无返回值
接口:
public interface Swimable{
public abstract void swimming();
}
方法
public static void goSwimming(Swimmable s){
s.Swimable();
}
无参无返回值
goSwimming(()->System.out.println("lambda表达式");});
2.2 有参有返回值
接口:
public interface Smokeable{
public abstract int smoking(String name);
}
方法
public static void goSmoking(Smokeable s){
int i=s.smoking("中华");
System.out.println("返回值:"+i)
}
有参有返回值
goSmoking((String name)->{
System.out.println("我是lambda 抽烟");
return 1;
Lambda表达式相当于对接口的抽象方法的重写
3.实现原理
匿名内部类在编译后会形成新的类.$
Lambda表达式编译后不会形成新的类,在运行的时候形成类
经过反编译,invokedynamic做的事:
- 在类中新增一个方法区,方法体就是Lambda表达式中的代码
- 还会形成一个匿名内部类,实现接口,重写抽象方法
- 在接口的重写方法中会调用新生成的方法
4.引入
当一个接口中存在多个抽象方法时,如果使用lambda表达式,并不智能匹配对应的抽象方法,因此引入函数式接口
二 新的时间和日期的API
1.旧版日期API存在的问题
- 设计性差:java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date今包含日期
- 非线程安全:java.util.Date是非线程安全的,所有日期类型都是可变的,这是日期类最大的问题
- 时区处理麻烦:没有支持时区
2.新版时间API:线程安全,位于java.time包
- 本地时间和时区无关
- LocalDate:日期,年月日,格式:2020-02-02
- LocalTime:时间,时分秒,格式:16:38:2.158549300
- LocalDateTime:时间日期,年月日时分秒,格式:8020-02-02T16:38:2.158549300
- DareTimeFormatter:格式化时间
- ZonedDateTime:包含时区的时间