JavaRush /Java Blog /Random-TW /Java 8 指南。第2部分。
ramhead
等級 13

Java 8 指南。第2部分。

在 Random-TW 群組發布

日期API

Java 8 在 java.time 套件中包含全新的日期和時間 API。新的 Date API 與Joda-Time庫相當,但又不一樣。以下範例將涵蓋新 API 的最重要部分。
時鐘可以存取目前日期和時間。時鐘了解時區,因此可以用來代替 System.currentTimeMillis()返回當前時間(以毫秒為單位)。這種時間精度也用 Instant類來表示。 實例可用於建立繼承的 java.util.Date物件。 Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
時區
時區由抽象類別ZoneId 表示。可以使用統計工廠方法輕鬆存取它們。時區定義對於在瞬時日期和時間與本地日期和時間之間進行轉換非常重要的偏移量。 System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
當地時間
LocalTime 顯示不含時區的時間,例如 17:30:15。以下範例為上面定義的時區建立兩個本機時間物件。然後我們比較兩個物體並計算它們之間的小時和分鐘差異。 LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239 LocalTime 附帶各種工廠方法,使實例化更加容易,包括字串解析。 LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37
本地日期
LocalDate 顯示特定日期,例如 2014-03-11。實例是不可變的,其工作方式與 LocalTime 類似。此範例示範如何透過添加或減去天、月或年來計算新日期。請記住,對物件的每個操作都會傳回一個新物件。 LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY 從字串解析 LocalDate 就像解析 LocalTime 一樣簡單: DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24
本地日期時間
LocalDateTime 顯示日期時間。這是上面給出的日期和時間的組合,在一份副本中。LocalDateTime 執行個體是不可變的,其運作方式與 LocalTime 和 LocalDate 類似。我們可以使用方法來檢索我們需要的實例屬性值: LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439 與附加時區資訊一起,可以將實例轉換為即時實例。即時值可以輕鬆轉換為繼承自 java.util.Date 的舊型別。 Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 格式化日期時間的工作方式與格式化日期或時間的方式相同。我們可以使用手動定義的格式,而不是使用預先定義的日期格式。 DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13 與 java.text.NumberFormat 不同,新的 DateTimeFormatter 是不可變的且線程安全的。有關寫入格式的語法的更多信息,請閱讀 此處

註解

Java 8 中的註解是可重複的。讓我們看一個例子來說明它是如何運作的。首先,我們將定義一個儲存有效註解陣列的註解包裝器: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8 使我們能夠透過宣告註解 @Repeatable 來使用相同類型的多個註解。 選項 1:使用容器註解(老派)(Java 8 允許我們透過宣告@Repeatable註解來使用相同類型的多個註解。)選項 1:使用註解容器(老派) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} 選項 2:使用可重複註解(新功能) @Hint("hint1") @Hint("hint2") class Person {} 使用選項二,java編譯器隱式設定@Hint註解。這對於透過反射讀取註釋資訊很重要。 Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2 雖然我們還沒有為 Person類別宣告 @Hints註解,但可以使用 getAnnotation(Hints.class)方法讀取它。然而,更方便的方法是 getAnnotationsByType ,它使用 @Hint註解提供對所有註解的存取。此外,Java 8 中註解的使用擴展到兩個目的: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

這就是全部

我的 Java 8 程式設計教學已完成。如果您想了解有關 JDK 8 中所有新類別和 API 功能的更多信息,請閱讀我的下一篇文章。這將幫助您了解 JDK 8 中的所有新類別和隱藏功能,例如 Arrays.parallelSortStampedLockCompletableFuture
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION