JDK1.8几大新特性

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);
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值