JavaRush/Java блог/Random UA/Java 8. Посібник. 2 частина.
ramhead
13 рівень

Java 8. Посібник. 2 частина.

Стаття з групи Random UA
учасників

Date API

Java 8 містить нові API дати і часу в пакеті java.time. Новий Date API порівняємо з бібліотекою Joda-Time , проте це не те саме. Наступні приклади охоплять найважливіші частини нового API.
Clock
Clock дає доступ до поточної дати та часу. Clocks знають про часові пояси і тому можуть бути використані замість System.currentTimeMillis() для повернення поточного часу в мілісекундах. Таку точність у часі також представляє клас Instant . Instants можуть бути використані для створення успадкованих об'єктів java.util.Date . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Timezones
Timezones представлені абстрактним класом ZoneId . Вони легко можуть бути доступні за допомогою статистичних методів-фабрик. Timezones визначають зсуви, які важливі для перетворення між миттєвими та локальними датою та часом. 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
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 Разом з додатковою інформацією про тимчасову зону, екземпляр може бути конвертований в instant. 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 можуть бути повторюваними. Давайте подивимося на приклад, щоб уявити, як це. Для початку ми визначимо обгортку для анотацій, яка зберігає масив діючих анотацій @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } . Variant 1: Using the container annotation (old school) (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 .
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.