JavaRush /Blog Java /Random-ES /Guía de Java 8. Parte 2.
ramhead
Nivel 13

Guía de Java 8. Parte 2.

Publicado en el grupo Random-ES

API de fecha

Java 8 contiene API de fecha y hora completamente nuevas en el paquete java.time. La nueva API de fecha es comparable a la biblioteca Joda-Time , sin embargo, no es la misma. Los siguientes ejemplos cubrirán las partes más importantes de la nueva API.
Reloj
Reloj da acceso a la fecha y hora actuales. Los relojes reconocen las zonas horarias y, por lo tanto, se pueden usar en lugar de System.currentTimeMillis() para devolver la hora actual en milisegundos. Este tipo de precisión temporal también está representada por la clase Instantánea . Los instantes se pueden utilizar para crear objetos java.util.Date heredados . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Zonas horarias
Las zonas horarias están representadas por la clase abstracta ZoneId . Se puede acceder fácilmente a ellos utilizando métodos estadísticos de fábrica. Las zonas horarias definen compensaciones que son importantes para convertir entre fecha y hora instantáneas y locales. 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]
Hora local
LocalTime muestra la hora sin zona horaria, por ejemplo 17:30:15. El siguiente ejemplo crea dos objetos de hora local para las zonas horarias definidas anteriormente. Luego comparamos los dos objetos y calculamos la diferencia en horas y minutos entre ellos. 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 con varios métodos de fábrica para facilitar la creación de instancias, incluido el análisis de cadenas. 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
Fecha local
LocalDate muestra una fecha específica, por ejemplo 2014-03-11. Las instancias son inmutables y funcionan de manera similar a LocalTime. El ejemplo demuestra cómo calcular una nueva fecha sumando o restando días, meses o años. Tenga en cuenta que cada operación sobre un objeto devuelve un nuevo objeto. 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 Analizar LocalDate a partir de una cadena es tan simple como analizar 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
Fecha y hora local
LocalDateTime muestra la fecha y hora. Esta es una combinación de la fecha y hora indicadas anteriormente, en una sola copia. Las instancias de LocalDateTime son inmutables y funcionan de manera similar a LocalTime y LocalDate. Podemos usar métodos para recuperar los valores de propiedad de la instancia que necesitamos: 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 junto con información adicional de zona horaria, la instancia se puede convertir a instantánea. Los instantáneos se pueden convertir fácilmente a los tipos antiguos que heredan de 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 Formatear una fecha y hora funciona de la misma manera que formatear una fecha u hora. En lugar de utilizar formatos de fecha predefinidos, podemos utilizar formatos definidos 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 diferencia de java.text.NumberFormat, el nuevo DateTimeFormatter es inmutable y seguro para subprocesos. Para obtener más información sobre la sintaxis para formatos de escritura, lea aquí .

Anotaciones

Las anotaciones en Java 8 son repetibles. Veamos un ejemplo para ilustrar cómo funciona esto. Para comenzar, definiremos un contenedor de anotaciones que almacene una matriz de anotaciones válidas: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8 nos permite usar múltiples anotaciones del mismo tipo declarando la anotación @Repeatable. Opción 1: usar la anotación del contenedor (vieja escuela) (Java 8 nos permite usar múltiples anotaciones del mismo tipo declarando una anotación @Repeatable ). Opción 1: usar el contenedor de anotaciones (vieja escuela) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} Opción 2: usar anotaciones repetibles ( nueva característica) @Hint("hint1") @Hint("hint2") class Person {} Usando la opción dos, el compilador de Java establece implícitamente la anotación @Hint. Esto es importante para leer la información de las anotaciones mediante la reflexión. 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 Aunque no hemos declarado la anotación @Hints para la clase Persona , se puede leer usando el método getAnnotation(Hints.class) . Sin embargo, un método más conveniente es getAnnotationsByType , que proporciona acceso a todas las anotaciones mediante la anotación @Hint . Además, el uso de anotaciones en Java 8 se amplía a dos propósitos: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

Esto es todo

Mi tutorial de programación Java 8 está completo. Si desea obtener más información sobre todas las nuevas clases y funciones API en JDK 8, simplemente lea mi próximo artículo. Esto le ayudará a comprender todas las clases nuevas y funciones ocultas de JDK 8, como Arrays.parallelSort , StampedLock y CompletableFuture .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION