《寫給大忙人看的Java SE 8》——Java8新特性總結(二)

java聯盟發表於2017-11-07

新的日期和時間 API

Java8 引入了一個新的日期和時間API,位於java.time包下。
新的日期和時間API借鑑了Joda Time庫,其作者也為同一人,但它們並不是完全一樣的,做了很多改進。
下面來說一下幾個常用的類。首先是Instant,一個Instant物件表示時間軸上的一個點。Instant.now()會返回當前的瞬時點(格林威治時間)。Instant.MIN和Instant.MAX分別為十億年前和十億年後。
如下程式碼可以計算某演算法的執行時間:

Instant start = Instant.now();
runAlgorithm();
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
複製程式碼

Duration物件表示兩個瞬時點間的時間量。可以通過不同的方法,換算成各種時間單位。
上面所說的絕對時間並不能應用到生活中去,所以新的Java API中提供了兩種人類時間,本地日期/時間帶時區的時間
LocalDate是一個帶有年份、月份和天數的日期。建立他可以使用靜態方法now或者of。

LocalDate today = LocalDate.now();
LocalDate myBirthday = LocalDate.of(1994, 03, 15);
// use Enum
myBirthday = LocalDate.of(1994, Month.MARCH, 15);

System.out.println(today); // 2017-10-23
System.out.println(myBirthday); // 1994-03-15
複製程式碼

下面是LocalDate中的一些常用方法:

image
image

LocalTime表示一天中的某個時間,同樣可以使用now或者of來建立例項。
LocalTime rightNow = LocalTime.now();
LocalTime bedTime = LocalTime.of(2, 0);
System.out.println(rightNow); // 01:26:17.139
System.out.println(bedTime); // 02:00
複製程式碼

LocalDateTime 表示
一個日期和時間,用法和上面類似。上面幾種日期時間類都屬於本地時間,下面來說一下帶時區的時間。 ZonedDateTime 通過設定時區的id來建立一個帶時區的時間。

ZonedDateTime beijingOlympicOpenning = ZonedDateTime.of(2008, 8, 8, 20, 0, 0, 0, ZoneId.of("Asia/Shanghai"));
System.out.println(beijingOlympicOpenning); // 2008-08-08T20:00+08:00[Asia/Shanghai]
複製程式碼

更新後的API同樣加入了新的格式化類DateTimeFormatter。DateTimeFormatter提供了三種格式化方法來列印日期/時間:

  • 預定義的標準格式
String formattered = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(beijingOlympicOpenning);
System.out.println(formattered); // 2008-08-08T20:00:00
複製程式碼

DateTimeFormatter類提供了多種預定義的標準格式可供使用。

image
image
  • 語言環境相關的格式

標準格式主要用於機器可讀的時間戳。為了讓人能夠讀懂日期和時間,你需要使用語言環境相關的格式。
Java8提供了4種風格,SHORT、MEDIUM、LONG、FULL。

String formattered = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).format(beijingOlympicOpenning);
System.out.println(formattered);    //2008年8月8日 星期五 下午08時00分00秒 CST
複製程式碼
  • 自定義的格式
    或者你也可以自定義日期和時間的格式。
String formattered = DateTimeFormatter.ofPattern("E yyyy-MM-dd HH:mm").format(beijingOlympicOpenning);
System.out.println(formattered); // 星期五 2008-08-08 20:00
複製程式碼

下圖中為一些常用的模式元素。

image
image

新的API提供了從字串解析出日期/時間的parse靜態方法和與遺留類(java.util.Date、java.sql.Time和java.txt.DateFormat等)互相轉換的方法。

雜項改進

Java8在String類中只新增了一個新方法,就是join,該方法實現了字串的拼接,可以把它看作split方法的逆操作。

String joined = String.join(".", "www", "cnblogs", "com");
System.out.println(joined); // www.cnblogs.com
複製程式碼

數字包裝類提供了BYTES靜態方法,以byte為單位返回長度。
所有八種包裝類都提供了靜態的hashCode方法。
Short、Integer、Long、Float和Double這5種型別分別提供了了sum、max和min,用來在流操作中作為聚合函式使用。
集合類和介面中新增的方法:

image
image

Java8為使用流讀取檔案行及訪問目錄項提供了一些簡便的方法(Files.linesFiles.list)。同時也提供了進行Base64編碼/解碼的方法。
Java8對GUI程式設計(JavaFX)、併發等方面也做了改進,本文沒有一一列出。

歡迎加入學習交流群569772982,大家一起學習交流。


相關文章