API Tanggal
Java 8 berisi API tanggal dan waktu yang benar-benar baru dalam paket java.time. Date API yang baru sebanding dengan perpustakaan
Joda-Time , namun tidak sama. Contoh berikut akan membahas bagian terpenting dari API baru.
Jam
Jam memberikan akses ke tanggal dan waktu saat ini. Jam mengetahui zona waktu dan oleh karena itu dapat digunakan sebagai pengganti
System.currentTimeMillis() untuk mengembalikan waktu saat ini dalam milidetik. Ketepatan waktu semacam ini juga diwakili oleh kelas
Instan .
Instan dapat digunakan untuk membuat objek
java.util.Date yang diwarisi .
Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Zona waktu
Zona waktu diwakili oleh kelas abstrak
ZoneId . Mereka dapat dengan mudah diakses menggunakan metode statistik pabrik. Zona waktu menentukan offset yang penting untuk mengkonversi antara tanggal dan waktu instan dan lokal.
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]
Waktu lokal
LocalTime menampilkan waktu tanpa zona waktu, misalnya 17:30:15. Contoh berikut membuat dua objek waktu lokal untuk zona waktu yang ditentukan di atas. Kami kemudian membandingkan kedua objek tersebut dan menghitung perbedaan jam dan menit di antara keduanya.
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 hadir dengan berbagai metode pabrik untuk mempermudah pembuatan instance, termasuk penguraian string.
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
Tanggal Lokal
LocalDate menampilkan tanggal tertentu, misalnya 11-03-2014. Instance tidak dapat diubah dan bekerja serupa dengan LocalTime. Contoh ini menunjukkan cara menghitung tanggal baru dengan menambahkan atau mengurangi hari, bulan, atau tahun. Ingatlah bahwa setiap operasi pada suatu objek mengembalikan objek baru.
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
Mengurai LocalDate dari sebuah string semudah mengurai 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
TanggalWaktu Lokal
LocalDateTime menampilkan waktu tanggal. Ini adalah kombinasi tanggal dan waktu yang diberikan di atas, dalam satu salinan. Instance LocalDateTime tidak dapat diubah dan berfungsi serupa dengan LocalTime dan LocalDate. Kita dapat menggunakan metode untuk mengambil nilai properti instance yang kita perlukan:
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
Bersama dengan informasi zona waktu tambahan, instance dapat dikonversi menjadi instan. Instan dapat dengan mudah dikonversi ke tipe lama yang diwarisi dari 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
Cara kerja memformat tanggal-waktu sama seperti memformat tanggal atau waktu. Daripada menggunakan format tanggal yang telah ditentukan sebelumnya, kita dapat menggunakan format yang ditentukan secara manual.
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
Tidak seperti java.text.NumberFormat, DateTimeFormatter yang baru tidak dapat diubah dan aman untuk thread. Untuk informasi lebih lanjut tentang sintaks untuk format penulisan, baca
di sini .
Anotasi
Anotasi di Java 8 dapat diulang. Mari kita lihat contoh untuk mengilustrasikan cara kerjanya. Untuk memulai, kita akan mendefinisikan pembungkus anotasi yang menyimpan array anotasi yang valid:
@interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); }
Java 8 memungkinkan kita menggunakan beberapa anotasi bertipe sama dengan mendeklarasikan anotasi @Repeatable. Opsi 1: Menggunakan anotasi kontainer (jadul) (Java 8 memungkinkan kita menggunakan beberapa anotasi berjenis sama dengan mendeklarasikan
@Repeatable annotation .) Opsi 1: Menggunakan wadah anotasi (jadul)
@Hints({@Hint("hint1"), @Hint("hint2")}) class Person {}
Opsi 2: Menggunakan anotasi berulang ( fitur baru)
@Hint("hint1") @Hint("hint2") class Person {}
Menggunakan opsi dua, kompiler java secara implisit menyetel anotasi @Hint. Hal ini penting untuk membaca informasi anotasi melalui refleksi.
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
Meskipun kami belum mendeklarasikan anotasi
@Hints untuk kelas
Person , anotasi tersebut dapat dibaca menggunakan metode
getAnnotation(Hints.class) . Namun, metode yang lebih mudah adalah
getAnnotationsByType , yang menyediakan akses ke semua anotasi menggunakan
@Hint annotation . Selain itu, penggunaan anotasi di Java 8 diperluas untuk dua tujuan:
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}
Ini semua
Tutorial Pemrograman Java 8 saya sudah selesai. Jika Anda ingin mempelajari lebih lanjut tentang semua kelas dan fitur API baru di JDK 8, baca saja artikel saya berikutnya. Ini akan membantu Anda memahami semua kelas baru dan fitur tersembunyi di JDK 8, seperti
Arrays.parallelSort ,
StampedLock , dan
CompletableFuture .
GO TO FULL VERSION