欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java基础】JDK1.8新特性

程序员文章站 2022-06-07 13:17:34
...

JDK1.8新特性

  • Lambda表达式
    • 匿名内部类

      1. 操作符:new;
      2. 一个要实现的接口或要继承的类
      3. 一对括号,如果是匿名子类,与实例化普通类的语法类似,如果有构造参数,要带上构造参数;如果是实现一个接口,只需要一对空括号即可;
      4. 一段被"{}"括起来类声明主体;
      5. 末尾的";"号(因为匿名类的声明是一个表达式,是语句的一部分,因此要以分号结尾)。
    • Lambda

      如果接口中只有一个需要被实现的方法,可以使用Lambda表达式代替匿名内部类对接口进行简单实现。

      语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体

    • 一般用lambda表达式创建线程

      Thread t = new Thread(() -> {
          for (int i = 0; i < 10; i++) {
              System.out.println(2 + ":" + i);
          }
      }).start();
      

      其中()->{}代替匿名内部类实现了Runnable接口并重写了run方法。

    • 还可以使用方法引用构造器引用指向一个被实现了的匿名内部类方法

      /**
      * 格式:
      对象::实例方法名
      类::静态方法名
      类::实例方法名
      */
      public static void test2() {
          Employee employee = new Employee("张三", 12, 5555);
          Supplier<String> supplier = () -> employee.getName();
      
          // 使用方法引用
          Supplier<String> supplier1 = employee::getName;
      }
      
      /**
           * 构造器引用ClassName::new
           */
      public static void test() {
          Supplier<Employee> supplier = () -> new Employee("张三", 18, 13);
      
          // 构造器引用(调用的无参构造器)
          Supplier<Employee> supplier1 = Employee::new;
          Employee employee = supplier1.get();
      
          // 构造器引用(调用有参构造器,一个参数的)
          Function<Integer, Employee> function = Employee::new;
          Employee employee1 = function.apply(10);
      }
      
  • default和static

    JDK1.8允许用default和static关键字修饰接口中的方法,为了避免子类重复实现同样的代码

    default为接口中的抽象方法写了一个默认的方法体实现,可以在子接口继续复写这个方法;

    static修饰静态方法,可以直接使用接口调用。

  • Stream

    用于操作数据源(集合,数组等)所生成的元素序列,主要有创建流、中间操作、终止操作三步。

    1. 创建流

      //通过Collection系列集合的 stream() 或者 parallelStream() 获取流
      List<String> list = new ArrayList<>();
      Stream<String> stream =  list.stream();
      
    2. 中间操作【通过中间操作链,对数据源的数据进行处理】

      • filter( Predicate p):接收Lambda,从流中排除某些元素
      • distinct():筛选,通过流所生成的hashCode()和equals()去除重复元素
      • limit(long maxSize):截断流,使其元素不超过给定数量
      • skip(long n):跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流
      List<Employee> employees = Arrays.asList(
          new Employee("张三", 18, 3333),
          new Employee("李四", 38, 55555),
          new Employee("王五", 50, 6666.66),
          new Employee("赵六", 16, 77777.77),
          new Employee("田七", 8, 8888.88)
      );
      Stream<Employee> stream = employees.stream();
      stream.filter((x) -> x.getAge() > 30)
          .limit(2)
          .forEach(System.out::println);
      
    3. 终止操作

      比如forEach迭代操作,执行后Stream流将终止。

    Stream操作集合更加简洁易读,而且支持并发模式。

  • Fork/Join框架:

    就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个小的任务运算的结果进行join汇总。

    在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态,而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行,那么处理该子问题的线程会寻找其他尚未运行的子问题来执行,这种方式减少了线程的等待时间,提高了性能

    Stream 可以通过parallel() 与 sequential() 在并行流与顺序流之间进行切换

  • Optional类

    对于可能为null的变量可以用Optional修饰,不需要过多的null检查,也会减少空指针异常。