JDK1.8新特性

一、Lambda表达式

lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码

  1. 通过匿名内部类实现函数式接口

    1. 格式:(parameters) -> expression或者(parameters) -> {statements}
      • 不需声明参数类型,jvm会自动判断
      • 一个参数无需小括号
      • 一条语句无需大括号
      • 只有一条语句,jvm会自动返回值
    • 注意:
      1. lambda 表达式只能引用标记了 final 的外层局部变量,否则会编译错误
      2. lambda表达式的局部变量可以不用声明final,会自己生成
      3. 不可以声明一个局部变量同名的参数

二、函数式接口

  1. 只有一个抽象方法的接口
  2. 可以有多个非抽象的接口
  3. java1.8中所有的函数式接口
    • java.lang.Runnable
    • java.util.concurrent.Callable
    • java.security.PrivilegedAction
    • java.util.Comparator
    • java.io.FileFilter
    • java.nio.file.PathMatcher
    • java.lang.reflect.InvocationHandler
    • java.beans.PropertyChangeListener
    • java.awt.event.ActionListener
    • javax.swing.event.ChangeListener
    • java.util.function.*–java8新增,具体参考jdk1.8官方文档

三、默认方法

接口可以有实现方法,通过在方法名前面加default关键字

四、Stream API–使用

  1. 计算空字符串列表

    1
    2
    3
    List<String> strings = Arrays.asList("abc","","bc","efg","abcd","","jkl");
    count = strings.stream().filter(String::isEmpty).count();
    System.out.println("空字符串有:"+count);
  2. 字符串数量为3

    1
    2
    3
    List<String> strings = Arrays.asList("abc","","bc","efg","abcd","","jkl");
    count = strings.stream().filter(string -> string.length()==3).count();
    System.out.println(count);
  3. 删除空字符串

    1
    2
    List<String> filtered2 = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
    System.out.println("筛选后的列表: " + filtered2);
  4. 删除空字符串,并用逗号把它们连接起来

    1
    2
    String join = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
    System.out.println("合并字符串: " + join);
  5. 获取列表元素平方数

    1
    2
    3
    List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
    List<Integer> collect = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
    System.out.println("平方数列表: " + collect);
  6. 获取最大,最小,和,平均数

    1
    2
    3
    4
    5
    6
    List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
    IntSummaryStatistics stats = integers.stream().mapToInt(x -> x).summaryStatistics();
    System.out.println("列表中最大的数 : " + stats.getMax());
    System.out.println("列表中最小的数 : " + stats.getMin());
    System.out.println("所有数之和 : " + stats.getSum());
    System.out.println("平均数 : " + stats.getAverage());
  7. 输出10个随机数

    1
    random.ints().limit(10).sorted().forEach(System.out::println);
  8. 并行处理

    1
    long count1 = strings.parallelStream().filter(String::isEmpty).count();
  9. map

  10. Reduce

五、ForkJoin框架

六、Optional类

详细参考jdk1.8文档

  1. Optional可以为null的容器对象。可以用isPresent()方法判断,用get()返回对象
  2. Optional是一个容器,可以保存类型T的值,或者保存null
  3. Optional类很好的解决了空指针的问题
  4. image-20211208144016210

七、新时间日期API

  1. Local–简化日期时间的处理,没有时区的问题

    1. 获取当前时间日期
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 获取当前的日期时间
    LocalDateTime currentTime = LocalDateTime.now();
    System.out.println("当前时间: " + currentTime);

    LocalDate date1 = currentTime.toLocalDate();
    System.out.println("date1: " + date1);

    Month month = currentTime.getMonth();
    int day = currentTime.getDayOfMonth();
    int seconds = currentTime.getSecond();
    System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);
    1. 获取指定时间的日期
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);

    LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
    System.out.println("date3: " + date3);

    LocalTime date4 = LocalTime.of(22, 15);
    System.out.println("date4: " + date4);

    LocalTime date4 = LocalTime.of(22, 15);
    System.out.println("date4: " + date4);
  2. Zoned–通过制定的时区处理日期时间

    1. 获取当前时间日期

      1
      2
      3
      4
      5
      6
      7
      8
      ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
      System.out.println("date1: " + date1);

      ZoneId id = ZoneId.of("Europe/Paris");
      System.out.println("ZoneId: " + id);

      ZoneId currentZone = ZoneId.systemDefault();
      System.out.println("当期时区: " + currentZone);