1.接口这允许使用default方法,并在一个类实现该接口后能直接调用default:
interface JdkTest{
public abstract void PrintHello();
default void test(){
System.out.println("this is a test method");
}
}
public class demo2 implements JdkTest{
public void PrintHello(){
System.out.println("this is a PrintHello method");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
demo2 d=new demo2();
d.PrintHello();
d.test();
}
}
在代码中,接口JdkTest有一个抽象方法:PrintHello();以及一个default方法test。demo2实现该接口,重写抽象方法后,可以在测试中看见直接调用test方法。输出结果也符合test方法的输出。
2.Lambda表达式:
在jdk1.8之前,非基本对象的比较需要用到比较器,使用较为麻烦,具体代码如下:
public class demo3 {
public static void main(String[] args) {
List <String> rank =Arrays.asList("first","second","third");
Collections.sort(rank, new Comparator<String>() {
@Override
public int compare(String a,String b){
return b.compareTo(a);
}
} );
for(String name:rank){
System.out.println(name);
}
}
}
Arrays.asList的作用是将列表转换成数组,二者捆绑,修改其中一个另一个也将修改。但是不可用于基本数据类型数组。这里创建一个匿名比较器对象,然后传递给sort方法。
jdk1.8使用lambda降低了代码量,使得代码更加简洁。
public class demo3 {
public static void main(String[] args) {
List <String> rank1 =Arrays.asList("first","second","third");
List <String> rank2=Arrays.asList("first","second","third");
List <String> rank3=Arrays.asList("first","second","third");
System.out.println("------jdk1.8之前------");
Collections.sort(rank1, new Comparator<String>() {
@Override
public int compare(String a,String b){
return b.compareTo(a);
}
} );
for(String name:rank1){
System.out.println(name);
}
System.out.println("------lambda1.0------");
Collections.sort(rank2,(String a,String b)->{
return b.compareTo(a);
} );
for(String name:rank2){
System.out.println(name);
}
System.out.println("------lambda2.0------");
Collections.sort(rank3,(String a,String b)->b.compareTo(a));
for(String name:rank2){
System.out.println(name);
}
}
}
3.函数式接口
函数是接口仅包含一个抽象方法,但可以有default方法,因为这个不是抽象方法。经常与lanbda合用。用FunctionalInterface注解,则被这个注解的接口如果超过一个抽象类方法,那么系统就会被报错。
4.注解
在jdk1.8中,注解中增加使用范围,可以在任何范围使用;新增2个ElementType,分别是TYPE_USE和TYPE_PARAMETER;允许重复注解。
5.新的DateAPI
这一部分直接使用代码说明,注释很充分。个人觉得1.8后的DateAPI挺好用。
/*
* 新版本的DateTimeFormatter是线程安全的。
*/
public class demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("*********clock时钟*********");
/*
* Clock是时区敏感的,可以用System.currentTimeMillis()来获取当前微秒数
* 也能用Instant类来获取某一个特定的时间,也可以用来创建老的java.util.Date对象
*/
Clock clock =Clock.systemDefaultZone();
long millis =clock.millis();
System.out.println(millis+":"+System.currentTimeMillis());
Instant instant =clock.instant();
Date legacyDate =Date.from(instant);
System.out.println(legacyDate);
System.out.println("*******Timezones时区*******");
/*
* 在新API中使用 ZoneId来表示。时区可用静态方法of获取
*/
System.out.println(ZoneId.getAvailableZoneIds());
ZoneId zone1 =ZoneId.of("Europe/Berlin");
ZoneId zone2 =ZoneId.of("Brazil/East");
System.out.println(zone1.getRules());
System.out.println(zone2.getRules());
System.out.println("*********LocalTime*********");
/*
*定义一个没有时区信息的时间。例如:17:30:15
*/
LocalTime now1 =LocalTime.now(zone1);
LocalTime now2 =LocalTime.now(zone2);
System.out.println(now1.isBefore(now2));
long hoursBetween =ChronoUnit.HOURS.between(now1, now2);
long minutesBetween=ChronoUnit.MINUTES.between(now1, now2);
System.out.println(hoursBetween);
System.out.println(minutesBetween);
System.out.println("LocalTime提供多种工厂方法简化对象的创建,包括解析时间字符串");
LocalTime late=LocalTime.of(23, 59, 59);
System.out.println(late);
DateTimeFormatter germanFormatter=DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(Locale.GERMAN);
LocalTime leetTime =LocalTime.parse("13:37",germanFormatter);
System.out.println(leetTime);
System.out.println("******LocalDate******");
/*
* LocalDate表示确切的日期,如:2018-08-03 该对象值是不可变的。因此同String,修改后返回的是一个新实例。
*/
LocalDate today =LocalDate.now();
LocalDate tomorrow=today.plus(1,ChronoUnit.DAYS);
LocalDate yesterday=tomorrow.minusDays(2);
System.out.println(yesterday);
LocalDate independenceDay =LocalDate.of(2014, Month.JULY, 4);
DayOfWeek dayOfWeek=independenceDay.getDayOfWeek();
System.out.println(dayOfWeek);
DateTimeFormatter germanFormatter1 =DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.GERMAN);
LocalDate xms=LocalDate.parse("24.12.2014", germanFormatter1);
System.out.println(xms);
System.out.println("***LocalDateTime****");
/*
* 将LocalDate和LocalTime合并到同一个对象上。这三个都是不可变的
*/
LocalDateTime sylvester = LocalDateTime.of(2018, Month.AUGUST, 1, 0, 5,29);
DayOfWeek dayOfWeek1= sylvester.getDayOfWeek();
Month month=sylvester.getMonth();
int dayOfMonth1=sylvester.getDayOfMonth();
System.out.println(dayOfWeek1);
System.out.println(month);
System.out.println(dayOfMonth1);
long minuteOfDay=sylvester.getLong(ChronoField.MINUTE_OF_DAY);//距离给定的时间8.1日凌晨过去了几分钟。
System.out.println(minuteOfDay);
/*
* 附加时区信息,将其转换为一个时间点Instatn对象,然后就能容易转换为老的java.util.Date.
*/
Instant instant1=sylvester.atZone(ZoneId.systemDefault()).toInstant();
Date legacyDate1 =Date.from(instant1);
System.out.println(legacyDate1);
/*
* LocalDateTime除了使用预定义好的格式之外,还可以自己的定义格式
*/
DateTimeFormatter formatrer=DateTimeFormatter.ofPattern("MM dd, yyyy - HH:mm");
LocalDateTime parsed= LocalDateTime.parse("Nov 03, 2014 - 07:13",formatrer);
String string=formatrer.format(parsed);
System.out.println(string);
}
}