JavaRush /Blog Java /Random-PL /Przewodnik po Javie 8. Część 2.
ramhead
Poziom 13

Przewodnik po Javie 8. Część 2.

Opublikowano w grupie Random-PL

Data API

Java 8 zawiera zupełnie nowe API daty i godziny w pakiecie java.time. Nowe API Date jest porównywalne z biblioteką Joda-Time , jednakże nie jest to to samo. Poniższe przykłady obejmą najważniejsze części nowego API.
Zegar
Zegar umożliwia dostęp do aktualnej daty i godziny. Zegary rozpoznają strefy czasowe i dlatego można ich używać zamiast System.currentTimeMillis() do zwracania bieżącego czasu w milisekundach. Ten rodzaj precyzji czasu jest również reprezentowany przez klasę Instant . Instants można wykorzystać do tworzenia dziedziczonych obiektów java.util.Date . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Strefy czasowe
Strefy czasowe są reprezentowane przez klasę abstrakcyjną ZoneId . Można do nich łatwo uzyskać dostęp za pomocą statystycznych metod fabrycznych. Strefy czasowe definiują przesunięcia, które są ważne przy konwersji między chwilową a lokalną datą i godziną. 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]
Czas lokalny
LocalTime wyświetla czas bez strefy czasowej, na przykład 17:30:15. Poniższy przykład tworzy dwa obiekty czasu lokalnego dla stref czasowych zdefiniowanych powyżej. Następnie porównujemy oba obiekty i obliczamy różnicę w godzinach i minutach między nimi. 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 zawiera różne metody fabryczne ułatwiające tworzenie instancji, w tym analizowanie ciągów znaków. 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
Data lokalna
LocalDate wyświetla konkretną datę, na przykład 2014-03-11. Instancje są niezmienne i działają podobnie do LocalTime. Przykład pokazuje, jak obliczyć nową datę, dodając lub odejmując dni, miesiące lub lata. Należy pamiętać, że każda operacja na obiekcie zwraca nowy obiekt. 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 Analizowanie LocalDate z ciągu znaków jest tak proste, jak analizowanie 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
Data i godzina lokalna
LocalDateTime wyświetla datę i godzinę. Jest to połączenie daty i godziny podanych powyżej, w jednym egzemplarzu. Instancje LocalDateTime są niezmienne i działają podobnie do LocalTime i LocalDate. Możemy użyć metod, aby pobrać potrzebne nam wartości właściwości instancji: 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 Wraz z dodatkowymi informacjami o strefie czasowej instancję można przekonwertować na błyskawiczną. Instanty można łatwo przekonwertować na stare typy dziedziczące z 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 Formatowanie daty i godziny działa w taki sam sposób, jak formatowanie daty lub godziny. Zamiast korzystać z predefiniowanych formatów daty, możemy skorzystać z formatów definiowanych ręcznie. 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 W przeciwieństwie do java.text.NumberFormat, nowy DateTimeFormatter jest niezmienny i bezpieczny dla wątków. Aby uzyskać więcej informacji na temat składni zapisu formatów, przeczytaj tutaj .

Adnotacje

Adnotacje w Javie 8 są powtarzalne. Spójrzmy na przykład ilustrujący, jak to działa. Na początek zdefiniujemy opakowanie adnotacji, które przechowuje tablicę prawidłowych adnotacji: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8 umożliwia nam użycie wielu adnotacji tego samego typu poprzez zadeklarowanie adnotacji @Repeatable. Opcja 1: Użycie kontenera adnotacji (stara szkoła) (Java 8 pozwala nam używać wielu adnotacji tego samego typu poprzez zadeklarowanie adnotacji @Repeatable .) Opcja 1: Użycie kontenera adnotacji (stara szkoła) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} Opcja 2: Używanie powtarzalnych adnotacji ( nowa funkcja) @Hint("hint1") @Hint("hint2") class Person {} Korzystając z opcji drugiej, kompilator Java domyślnie ustawia adnotację @Hint. Jest to ważne przy odczytywaniu adnotacji poprzez refleksję. 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 Chociaż nie zadeklarowaliśmy adnotacji @Hints dla klasy Person , można ją odczytać za pomocą metody getAnnotation(Hints.class) . Jednak wygodniejszą metodą jest getAnnotationsByType , która zapewnia dostęp do wszystkich adnotacji za pomocą adnotacji @Hint . Ponadto użycie adnotacji w Javie 8 ma dwa cele: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

To wszystko

Mój samouczek programowania w języku Java 8 został ukończony. Jeśli chcesz dowiedzieć się więcej o wszystkich nowych klasach i funkcjach API w JDK 8, przeczytaj mój kolejny artykuł. Pomoże Ci to zrozumieć wszystkie nowe klasy i ukryte funkcje JDK 8, takie jak Arrays.parallelSort , StampedLock i CompletableFuture .
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION