JavaRush /Blogue Java /Random-PT /Guia Java 8. Parte 2.
ramhead
Nível 13

Guia Java 8. Parte 2.

Publicado no grupo Random-PT

API de data

Java 8 contém APIs de data e hora completamente novas no pacote java.time. A nova API Date é comparável à biblioteca Joda-Time , porém não é a mesma. Os exemplos a seguir cobrirão as partes mais importantes da nova API.
Relógio
O relógio dá acesso à data e hora atuais. Os relógios reconhecem os fusos horários e, portanto, podem ser usados ​​em vez de System.currentTimeMillis() para retornar a hora atual em milissegundos. Esse tipo de precisão de tempo também é representado pela classe Instant . Instantes podem ser usados ​​para criar objetos java.util.Date herdados . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Fusos horários
Os fusos horários são representados pela classe abstrata ZoneId . Eles podem ser facilmente acessados ​​usando métodos estatísticos de fábrica. Os fusos horários definem compensações que são importantes para a conversão entre data e hora instantânea e local. 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]
Horário local
LocalTime exibe a hora sem fuso horário, por exemplo 17:30:15. O exemplo a seguir cria dois objetos de horário local para os fusos horários definidos acima. Em seguida, comparamos os dois objetos e calculamos a diferença em horas e minutos entre eles. 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 vem com vários métodos de fábrica para facilitar a instanciação, incluindo análise de string. 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
DataLocal
LocalDate exibe uma data específica, por exemplo 11/03/2014. As instâncias são imutáveis ​​e funcionam de forma semelhante ao LocalTime. O exemplo demonstra como calcular uma nova data adicionando ou subtraindo dias, meses ou anos. Lembre-se de que cada operação em um objeto retorna um novo 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 Analisar LocalDate de uma string é tão simples quanto analisar 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
DataLocalHora
LocalDateTime exibe a data e hora. Esta é uma combinação da data e hora fornecidas acima, em uma cópia. As instâncias LocalDateTime são imutáveis ​​e funcionam de forma semelhante a LocalTime e LocalDate. Podemos usar métodos para recuperar os valores de propriedade da instância de que precisamos: 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 Juntamente com informações adicionais de fuso horário, a instância pode ser convertida em instantânea. Os instantes podem ser facilmente convertidos para os tipos antigos herdados 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 A formatação de data e hora funciona da mesma forma que a formatação de data ou hora. Em vez de usar formatos de data predefinidos, podemos usar 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 Ao contrário de java.text.NumberFormat, o novo DateTimeFormatter é imutável e seguro para threads. Para mais informações sobre a sintaxe para escrever formatos, leia aqui .

Anotações

As anotações em Java 8 são repetíveis. Vejamos um exemplo para ilustrar como isso funciona. Para começar, definiremos um wrapper de anotação que armazena um array de anotações válidas: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8 nos permite usar múltiplas anotações do mesmo tipo declarando a anotação @Repeatable. Opção 1: Usando a anotação de contêiner (old school) (Java 8 nos permite usar várias anotações do mesmo tipo declarando uma anotação @Repeatable .) Opção 1: Usando o contêiner de anotação (old school) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} Opção 2: Usando anotações repetíveis ( novo recurso) @Hint("hint1") @Hint("hint2") class Person {} Usando a opção dois, o compilador java define implicitamente a anotação @Hint. Isso é importante para ler as informações da anotação por meio da reflexão. 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 Embora não tenhamos declarado a anotação @Hints para a classe Person , ela pode ser lida usando o método getAnnotation(Hints.class) . No entanto, um método mais conveniente é getAnnotationsByType , que fornece acesso a todas as anotações usando a anotação @Hint . Além disso, o uso de anotações no Java 8 se expande para duas finalidades: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

Isso é tudo

Meu tutorial de programação Java 8 está completo. Se você quiser saber mais sobre todas as novas classes e recursos de API do JDK 8, basta ler meu próximo artigo. Isso ajudará você a entender todas as novas classes e recursos ocultos do JDK 8, como Arrays.parallelSort , StampedLock e CompletableFuture .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION