JavaRush /Java Blog /Random-IT /Guida Java8. Parte 2.
ramhead
Livello 13

Guida Java8. Parte 2.

Pubblicato nel gruppo Random-IT

API della data

Java 8 contiene API di data e ora completamente nuove nel pacchetto java.time. La nuova API Date è paragonabile alla libreria Joda-Time , tuttavia non è la stessa. Gli esempi seguenti copriranno le parti più importanti della nuova API.
Orologio
Orologio dà accesso alla data e all'ora correnti. Gli orologi riconoscono i fusi orari e possono quindi essere utilizzati al posto di System.currentTimeMillis() per restituire l'ora corrente in millisecondi. Questo tipo di precisione temporale è rappresentato anche dalla classe Instant . Gli istantanei possono essere utilizzati per creare oggetti java.util.Date ereditati . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Fusi orari
I fusi orari sono rappresentati dalla classe astratta ZoneId . È possibile accedervi facilmente utilizzando metodi di fabbrica statistica. I fusi orari definiscono gli offset importanti per la conversione tra data e ora istantanee e locali. 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]
Ora locale
LocalTime visualizza l'ora senza fuso orario, ad esempio 17:30:15. Nell'esempio seguente vengono creati due oggetti ora locale per i fusi orari definiti in precedenza. Confrontiamo quindi i due oggetti e calcoliamo la differenza in ore e minuti tra loro. 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 viene fornito con vari metodi di fabbrica per semplificare la creazione di istanze, inclusa l'analisi delle stringhe. 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 visualizza una data specifica, ad esempio 2014-03-11. Le istanze sono immutabili e funzionano in modo simile a LocalTime. L'esempio mostra come calcolare una nuova data aggiungendo o sottraendo giorni, mesi o anni. Tieni presente che ogni operazione su un oggetto restituisce un nuovo oggetto. 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 Analizzare LocalDate da una stringa è semplice come analizzare 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 visualizza la data e l'ora. Questa è una combinazione della data e dell'ora indicate sopra, in un'unica copia. Le istanze LocalDateTime sono immutabili e funzionano in modo simile a LocalTime e LocalDate. Possiamo utilizzare metodi per recuperare i valori delle proprietà dell'istanza di cui abbiamo bisogno: 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 insieme a ulteriori informazioni sul fuso orario, l'istanza può essere convertita in istante. Gli istantanei possono essere facilmente convertiti nei vecchi tipi che ereditano da 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 La formattazione di una data-ora funziona allo stesso modo della formattazione di una data o di un'ora. Invece di utilizzare formati di data predefiniti, possiamo utilizzare formati definiti manualmente. 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 A differenza di java.text.NumberFormat, il nuovo DateTimeFormatter è immutabile e thread-safe. Per ulteriori informazioni sulla sintassi per la scrittura dei formati, leggi qui .

Annotazioni

Le annotazioni in Java 8 sono ripetibili. Diamo un'occhiata a un esempio per illustrare come funziona. Per iniziare, definiremo un wrapper di annotazioni che memorizza un array di annotazioni valide: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8 ci consente di utilizzare più annotazioni dello stesso tipo dichiarando l'annotazione @Repeatable. Opzione 1: utilizzo dell'annotazione contenitore (vecchia scuola) (Java 8 ci consente di utilizzare più annotazioni dello stesso tipo dichiarando un'annotazione @Repeatable .) Opzione 1: utilizzo del contenitore annotazioni (vecchia scuola) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} Opzione 2: utilizzo di annotazioni ripetibili ( nuova funzionalità) @Hint("hint1") @Hint("hint2") class Person {} Utilizzando l'opzione due, il compilatore Java imposta implicitamente l'annotazione @Hint. Questo è importante per leggere le informazioni sulle annotazioni attraverso la riflessione. 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 Sebbene non abbiamo dichiarato l' annotazione @Hints per la classe Person , può essere letta utilizzando il metodo getAnnotation(Hints.class) . Tuttavia, un metodo più conveniente è getAnnotationsByType , che fornisce l'accesso a tutte le annotazioni utilizzando l' annotazione @Hint . Inoltre, l'uso delle annotazioni in Java 8 si espande a due scopi: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

Questo è tutto

Il mio tutorial sulla programmazione Java 8 è completo. Se vuoi saperne di più su tutte le nuove classi e funzionalità API in JDK 8, leggi il mio prossimo articolo. Questo ti aiuterà a comprendere tutte le nuove classi e le funzionalità nascoste in JDK 8, come Arrays.parallelSort , StampedLock e CompletableFuture .
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION