jdk新特性Lambda表达式和新时间日期API

一 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:包含时区的时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值