JDK8 特性詳解
Base64
對Base64編碼的支持已經被加入到Java 8官方庫中,這樣不需要使用第三方庫就可以進行Base64編碼,例子代碼如下:
1 package com.cn.yunliu.jdk8; 2 3 import java.nio.charset.StandardCharsets; 4 import java.util.Base64; 5 6 /** 7 * 8 * @author Administrator 9 * 10 * base64 編碼格式 與解碼 11 */ 12 public class Base64Code { 13 public staticvoid main(String[] args) { 14 String str = "demo"; 15 //base64 encoded 把str轉換成base64 bytes 16 String encoded = Base64.getEncoder().encodeToString(str.getBytes(StandardCharsets.UTF_8)); 17 System.out.println("encoded:"+encoded); 18 19 //base64 decoded 20String decoded = new String(Base64.getDecoder().decode(encoded),StandardCharsets.UTF_8); 21 System.out.println("decoded:"+decoded); 22 } 23 }
這個例子的輸出結果如下:
encoded:ZGVtbw==
decoded:demo
新的Base64API也支持URL和MINE的編碼解碼。
(Base64.getUrlEncoder() / Base64.getUrlDecoder(), Base64.getMimeEncoder
Date/Time API(JSR 310)
Java 8引入了新的Date-Time API(JSR 310)來改進時間、日期的處理。時間和日期的管理一直是最令Java開發者痛苦的問題。java.util.Date和後來的java.util.Calendar一直沒有解決這個問題(甚至令開發者更加迷茫)。
因為上面這些原因,誕生了第三方庫Joda-Time,可以替代Java的時間管理API。Java 8中新的時間和日期管理API深受Joda-Time影響,並吸收了很多Joda-Time的精華。新的java.time包包含了所有關於日期、時間、時區、Instant(跟日期類似但是精確到納秒)、duration(持續時間)和時鐘操作的類。新設計的API認真考慮了這些類的不變性(從java.util.Calendar吸取的教訓),如果某個實例需要修改,則返回一個新的對象。
1 package com.cn.yunliu.jdk8; 2 3 import java.time.Clock; 4 import java.time.Duration; 5 import java.time.Instant; 6 import java.time.LocalDate; 7 import java.time.LocalDateTime; 8 import java.time.LocalTime; 9 import java.time.Month; 10 /** 11 * 12 * @author Administrator 13 * 14 *jdk 8 date 特性 15 */ 16 17 public class DateCode { 18 public static void main(String[] args) { 19 //localDate 只顯示年月日 20 LocalDate ld = LocalDate.now(); 21 System.out.println("localdate:"+ld); 22 //LocalTime 只顯示時分秒 23 LocalTime lt = LocalTime.now(); 24 System.out.println("localtime:"+lt); 25 26 //Clock類使用時區來返回當前的納秒時間和日期,Clock可以替代System.currentTimeMillis()和TimeZone.getDefault()。 27 Clock clock = Clock.systemUTC(); 28 System.out.println("clock:"+clock); 29 Instant instant = clock.instant(); 30 System.out.println("instant:"+instant); 31 32 //localDateTime 包含了LocalDate和LocalTime的信息,但是不包含ISO-8601日歷系統中的時區信息 33 LocalDateTime ldt = LocalDateTime.now(); 34 System.out.println("LocalDateTime:"+ldt); 35 36 //ZoneDateTime 它保存有ISO-8601日期系統的日期和時間,而且有時區信息。 37 38 //Duration 它持有的時間精確到秒和納秒。這使得我們可以很容易得計算兩個日期之間的不同 39 LocalDateTime start = LocalDateTime.of(2016, Month.JULY, 20, 18, 18); 40 LocalDateTime end = LocalDateTime.of(2017, Month.JULY, 20, 18, 18); 41 Duration dur = Duration.between(start, end); 42 43 System.out.println("2個時間差為:"+dur.toDays()+"day"+"\t"+dur.compareTo(Duration.ZERO)); 44 } 45 }
例子的輸出結果是:
localdate:2018-08-13
localtime:17:29:13.438
clock:SystemClock[Z]
instant:2018-08-13T09:29:13.453Z
LocalDateTime:2018-08-13T17:29:13.469
2個時間差為:365day 1
Optional
Java應用中最常見的bug就是空值異常。在Java 8之前,Google Guava引入了Optionals類來解決NullPointerException,從而避免源碼被各種null檢查汙染,以便開發者寫出更加整潔的代碼。Java 8也將Optional加入了官方庫。
Optional僅僅是一個容易:存放T類型的值或者null。它提供了一些有用的接口來避免顯式的null檢查,可以參考Java 8官方文檔了解更多細節。
接下來看一點使用Optional的例子:可能為空的值或者某個類型的值:
1 package com.cn.yunliu.jdk8; 2 3 import java.util.Optional; 4 /** 5 * 6 * @author Administrator 7 *如果Optional實例持有一個非空值,則isPresent()方法返回true, 8 *否則返回false;orElseGet()方法,Optional實例持有null, 9 *則可以接受一個lambda表達式生成的默認值; 10 *map()方法可以將現有的Opetional實例的值轉換成新的值; 11 *orElse()方法與orElseGet()方法類似,但是在持有null的時候返回傳入的默認值。 12 */ 13 public class OptionalCode { 14 public static void main(String[] args) { 15 //Optional實例為null,isPresent返回false 16 Optional<?> fullName = Optional.ofNullable("1");//or null 17 fullName.isPresent(); 18 System.out.println(fullName.isPresent()); 19 20 //orElseGet()方法,Optional實例持有null,則可以接受一個lambda表達式生成的默認值 21 fullName.orElseGet(()->"none"); 22 System.out.println(fullName.orElseGet(()->"none")); 23 Optional<?> opt =Optional.of("1"); 24 System.out.println(opt.orElse(null)); 25 26 //map()方法可以將現有的Opetional實例的值轉換成新的值; 27 fullName.map(s->"nihao").orElse("none"); 28 System.out.println(fullName.map(s->"nihao").orElse("none")); 29 } 30 }
有值得輸出結果如下:
true
1
1
nihao
當fullName為null時輸出結果如下:
false
none
1
none
JDK8 特性詳解