JavaRush /จาวาบล็อก /Random-TH /คู่มือจาวา 8 ส่วนที่ 2
ramhead
ระดับ

คู่มือจาวา 8 ส่วนที่ 2

เผยแพร่ในกลุ่ม

วันที่ API

Java 8 มี API วันที่และเวลาใหม่ทั้งหมดในแพ็คเกจ java.time 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
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 แสดงวันที่และเวลา นี่เป็นการรวมวันที่และเวลาที่ระบุไว้ข้างต้นไว้ในสำเนาเดียว อินสแตนซ์ 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 เมื่อใช้ร่วมกับข้อมูลโซนเวลาเพิ่มเติม อินสแตนซ์ก็สามารถแปลงเป็นแบบทันทีได้ Instants สามารถแปลงเป็นประเภทเก่าที่สืบทอดมาจาก 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 สามารถทำซ้ำได้ ลองดูตัวอย่างเพื่อแสดงให้เห็นว่ามันทำงานอย่างไร ในการเริ่มต้น เราจะกำหนด wrapper คำอธิบายประกอบที่เก็บอาร์เรย์ของคำอธิบายประกอบที่ถูกต้อง: @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 แม้ว่าเราจะไม่ได้ประกาศ คำอธิบายประกอบ @Hintsสำหรับ คลาส Personแต่ก็สามารถอ่านได้โดยใช้ เมธอด getAnnotation(Hints.class ) อย่างไรก็ตาม วิธีที่สะดวกกว่าคือ getAnnotationsByTypeซึ่งให้การเข้าถึงคำอธิบายประกอบทั้งหมดโดยใช้ คำอธิบาย ประกอบ @Hint นอกจากนี้ การใช้คำอธิบายประกอบใน Java 8 ยังขยายไปสู่วัตถุประสงค์สองประการ: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

นี่คือทั้งหมด

บทช่วยสอนการเขียนโปรแกรม Java 8 ของฉันเสร็จสมบูรณ์แล้ว หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับคลาสใหม่และฟีเจอร์ API ใน JDK 8 โปรดอ่านบทความถัดไปของฉัน สิ่ง นี้ จะช่วยให้คุณเข้าใจคลาสใหม่และฟีเจอร์ที่ซ่อนอยู่ใน JDK 8 เช่น Arrays.parallelSort , StampedLockและ CompletableFuture
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION