1. 程式人生 > >JDK8 特性詳解

JDK8 特性詳解

handle 實例 zone localdate 當前 ins 值轉換 默認值 end

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 static
void 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 20
String 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

() / Base64.getMimeDecoder())。

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 特性詳解