对于流在工作中有用,对于接口中的default也常在jdk源码中看到,今天对它们做一个小小的总结,流在我之前的文章已经讲到过,故在这里不再介绍
1.接口中的默认方法
这个说起来很简单,就是让接口对方法有了默认的实现。用到的关键字是default。
public interface InterfaceDefault {
String name ();
default void hello () {
System.out.println("nihao");
}
}
1.1使用场景
我想重点是default的使用场景,假想,我们之前有一个接口,它有许多实现类,但是现在我想为它的每一实现类都加一个新的相同方法,那么没有default之前,我就得为每一个实现类写一个加上重复的方法,但是现在有了default ,我只需要在接口里加上这个默认实现了。
1.2与抽象类的区别
那么接口和抽象类还有什么区别勒,它们现在都是不可以直接实例化,都可以有方法实现,已经很像了。但是我想,它们核心区别还是出发点不同,接口是对行为的抽象,抽象类是对类的抽象。具体的小区别还有 接口不能有private/成员变量/构造器
2.Lambda
我们可以用Lambda来代替匿名内部类来简化编码,那么它是对匿名内部类的语法糖吗,lamdba确实是语法糖,但是不是匿名内部类的语法糖。
我们在排序,线程任务声名中常用到
new thread( () -> {
//doSomeThing
}).start();
3.函数式接口
@FunctionalInterface
public interface InterfaceDefault {
String one ();
String two ();
default void hello () {
System.out.println("nihao");
}
}
如上,我们如在一个类型上加了函数式接口注解,那么该接口 有且只有一个未实现的方法,故上面肯定是不行的。
3.1意义
最主要的意思当然是为了配合lamdba,当我们要实现一个函数式接口时,可以用lamdba来实现。当然,我们也可以用::,代表对象方法或者构造函数。如我们的Runable接口
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
4.时间api
总的来说,新的api是不可变且线程安全的,还提供了丰富的功能。
public class DataApi {
public static void main(String[] args) {
LocalDateTime nowTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String time = formatter.format(nowTime);
System.out.println(time);
//格式化
String timeStr = "2020-03-23 12:34:34";
LocalDateTime localDateTime = LocalDateTime.parse(timeStr, formatter);
String time1 = localDateTime.format(formatter);
System.out.println(time1);
//获取年月日
System.out.println("当前月中的第" + localDateTime.getDayOfMonth() + "天");
System.out.println("当前年中的第" + localDateTime.getDayOfYear() + "天");
System.out.println("当前周中的" + localDateTime.getDayOfWeek());
System.out.println("现在是" + localDateTime.getMonth());
//获取差值
Duration duration = Duration.between(localDateTime, nowTime);
System.out.println("相差了" + duration.toDays() + "天");
System.out.println("相差了" + duration.toHours() + "小时");
//修改年月日 注意 这是返回新的对象
localDateTime = localDateTime.plusYears(1);
localDateTime = localDateTime.minusYears(3);
System.out.println("现在是"+ localDateTime.getYear() + "年");
localDateTime = localDateTime.withYear(2049);
System.out.println("现在是"+ localDateTime.getYear() + "年");
//使用TemporalAdjusters来实现一些计算 例如当前年第一天等
LocalDateTime.now().with(firstDayOfYear());
localDateTime.now().with(lastDayOfMonth());
//Date与LocalDate的相互转化
Instant instance = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
LocalDate localDate = localDateTime.toLocalDate();
}
}