一、接口中的静态方法和默认方法

在java8之前,接口中只能有全局静态常量和抽象方法。

二、新时间日期API

传统时间格式化存在线程安全问题

新时间日期API:

  • LocalDate,LocalDateTime,LocalTime:人读的时间和日期
  • Instant(时间戳):机读的时间戳
  • Duration:计算两个时间之间的间隔
  • Period:计算两个日期之间的间隔
  • OffsetTime:对时间做偏移量运算(比如加几个小时,减几个小时)

    1. @Test
    2. public void test3() throws ExecutionException, InterruptedException {
    3. DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    4. Callable<LocalDate> task = new Callable<LocalDate>() {
    5. @Override
    6. public LocalDate call() throws Exception {
    7. return LocalDate.parse("20210717", dtf);
    8. }
    9. };
    10. ExecutorService pool = Executors.newFixedThreadPool(10);
    11. List<Future<LocalDate>> results = new ArrayList<>();
    12. for (int i = 0; i < 10; i++) {
    13. results.add(pool.submit(task));
    14. }
    15. for (Future<LocalDate> result : results) {
    16. System.out.println(result.get());
    17. }
    18. }

    LocalDate,LocalTime,LocalDateTime的类的实例是不可变的对象,分别标识使用ISO-8601日期系统的提起、时间、日期和时间,他们提供了简单的日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

    1、本地时间与时间戳

    1. public class LocalDateTimTest {
    2. /**
    3. * Duration:计算两个“时间”之间的间隔
    4. * Period:计算两个“日期”之间的间隔
    5. */
    6. @Test
    7. public void test4() {
    8. Instant instant = Instant.now();
    9. try {
    10. Thread.sleep(1000);
    11. } catch (InterruptedException e) {
    12. e.printStackTrace();
    13. }
    14. Instant instant1 = Instant.now();
    15. Duration duration = Duration.between(instant, instant1);
    16. System.out.println(duration); // PT1.009S
    17. System.out.println("-----------------");
    18. LocalTime time = LocalTime.now();
    19. try {
    20. Thread.sleep(1000);
    21. } catch (InterruptedException e) {
    22. e.printStackTrace();
    23. }
    24. LocalTime time1 = LocalTime.now();
    25. long millis = Duration.between(time, time1).toMillis();
    26. System.out.println(millis); // 1006
    27. }
    28. /**
    29. * 以下是机读的——时间戳(以Unix元年——1970年1月1日00:00:00 到某个时间之间的毫秒值)
    30. */
    31. @Test
    32. public void test3() {
    33. Instant now = Instant.now(); // 默认获取 UTC 时区(与中国差八个小时,比中国慢8个小时)
    34. System.out.println(now); // 2021-07-17T14:09:32.062Z
    35. OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8)); // 加上8个小时即为中国时间
    36. System.out.println(offsetDateTime); // 2021-07-17T22:09:32.062+08:00
    37. // 获取时间戳
    38. System.out.println(now.toEpochMilli()); // 1626531117816
    39. }
    40. /**
    41. * 以下是人读的
    42. */
    43. @Test
    44. public void test() {
    45. LocalDateTime now = LocalDateTime.now(); // now() : 获取当前日期时间
    46. System.out.println(now); // 2021-07-17T21:55:51.507
    47. LocalDate now1 = LocalDate.now();
    48. System.out.println(now1); // 2021-07-17
    49. LocalTime now2 = LocalTime.now();
    50. System.out.println(now2); // 21:55:51.508
    51. }
    52. @Test
    53. public void test2() {
    54. LocalDateTime localDateTime = LocalDateTime.of(2020, 6, 6, 13, 14, 30, 345); // 指定日期时间
    55. System.out.println(localDateTime); // 2020-06-06T13:14:30.000000345
    56. LocalDate localDate = LocalDate.of(2019, 06, 4);
    57. System.out.println(localDate); // 2019-06-04
    58. }
    59. }

    2、时间校正器

  • TemporalAdjuster:时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。

  • TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现。

    1. @Test
    2. public void test5() {
    3. LocalDateTime localDateTime = LocalDateTime.now();
    4. System.out.println(localDateTime); // 2021-07-18T08:46:10.854
    5. LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(10);
    6. System.out.println(localDateTime1); // 2021-07-10T08:46:10.854
    7. LocalDateTime dateTime = localDateTime.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
    8. System.out.println(dateTime); // 2021-07-23T08:48:01.609
    9. }

    3、时间格式化与时区的处理

    1. /**
    2. * DateTimeFormatter:格式化时间/日期
    3. */
    4. @Test
    5. public void test6() {
    6. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_DATE;
    7. LocalDateTime localDateTime = LocalDateTime.now();
    8. System.out.println(localDateTime); // 2021-07-18T08:54:41.321
    9. // 根据自定义格式来格式化日期
    10. String format = localDateTime.format(dateTimeFormatter);
    11. System.out.println(format); // 2021-07-18
    12. }
    1. /**
    2. * DateTimeFormatter:格式化时间/日期
    3. */
    4. @Test
    5. public void test6() {
    6. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_DATE;
    7. LocalDateTime localDateTime = LocalDateTime.now();
    8. System.out.println(localDateTime); // 2021-07-18T08:59:28.196
    9. // 根据指定格式来格式化日期
    10. String format = localDateTime.format(dateTimeFormatter);
    11. System.out.println(format); // 2021-07-18
    12. // 根据自定义格式来格式化日期
    13. DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
    14. String format1 = dtf2.format(localDateTime);
    15. System.out.println(format1); // 2021年07月18日 08:59:28
    16. // 将字符串解析回时间日期
    17. CharSequence text;
    18. LocalDateTime newDateTime = localDateTime.parse(format1, dtf2);
    19. System.out.println(newDateTime); // 2021-07-18T08:59:28
    20. }
    1. /**
    2. * 对时区的处理
    3. * ZoneDate、ZonedTime、ZonedDateTime
    4. */
    5. @Test
    6. public void test7() {
    7. // 指定时区来获取时间
    8. LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
    9. System.out.println(localDateTime); // 2021-07-18T09:07:19.661
    10. // 构建一个带时区的时间
    11. LocalDateTime localDateTime1 = LocalDateTime.now();
    12. ZonedDateTime zonedDateTime = localDateTime1.atZone(ZoneId.of("Asia/Shanghai"));
    13. System.out.println(zonedDateTime); // 2021-07-18T09:07:19.670+08:00[Asia/Shanghai]
    14. }

    三、重复注解与类型注解

    Java 8 对注解提供了两点改进:可重复的注解及可用于类型的注解。

    1、重复注解

    1. /**
    2. * 自定义注解
    3. */
    4. @Repeatable(MyAnnotations.class) // 若想定义重复注解,必须用@Repeatable修饰,然后注入此注解的容器类
    5. @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    6. @Retention(RetentionPolicy.RUNTIME)
    7. public @interface MyAnnotation {
    8. String value() default "hgk";
    9. }
    1. /**
    2. * 创建一个容器
    3. */
    4. @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    5. @Retention(RetentionPolicy.RUNTIME)
    6. public @interface MyAnnotations {
    7. MyAnnotation[] value();
    8. }

    ```java public class AnnTest {

    @Test public void test() throws NoSuchMethodException {

    1. Class<AnnTest> clazz = AnnTest.class;
    2. Method showMethod = clazz.getMethod("show");
    3. MyAnnotation[] mas = showMethod.getDeclaredAnnotationsByType(MyAnnotation.class);
    4. for (MyAnnotation ma : mas) {
    5. System.out.println(ma.value());
    6. /**
    7. * 输出:
    8. * Hello
    9. * World
    10. */
    11. }

    }

    @MyAnnotation(“Hello”) @MyAnnotation(“World”) public void show() { }

} ```