Java新特性

发布时间 2023-08-31 20:37:11作者: yanggdgg

一、Java新特性

主要内容

  • Lambda表达式

  • 函数式接口

  • 方法引用

  • Stream流式编程

二、函数式接口

函数式接口:接口中只能有一个抽象方法,其他的可以有default、static、Object里继承的方法等

作用:在Java中主要用在Lambda表达式和方法引用(想使用Lambda表达式,接口必须为函数式接口)。

JDK8专门提供了@FunctionalInterface注解,用来进行编译检查。

已经使用过的函数式接口,比如Comparator等,多线程阶段学习的函数式接口有Runnable、Callable等。

注意:Comparable并没有被标记为函数式接口

内置的函数式接口

JDK 也提供了大量的内置函数式接口,使得 Lambda 表达式的运用更加方便、高效。这些内置的函数式接口已经可以解决我们开发过程中绝大部分的问题,只有一小部分比较特殊得情况需要我们自己去定义函数式接口。在这里特别介绍四个函数式接口。

  1. Consumer<T>:消费型接口(void accept(T t))。有参数,无返回值。

  2. Supplier<T>:供给型接口(T get())。只有返回值,没有入参。

  3. Function<T, R>:函数型接口(R apply(T t))。一个输入参数,一个输出参数,两种类型不可不同、可以一致。

  4. Predicate<T>:断言型接口(boolean test(T t))。输入一个参数,输出一个boolean类型得返回值。

函数式接口方法名输入参数输出参数作用
消费型接口Consumer void accept(T t) T void 对类型为T的对象进行操作
供给型接口Supplier T get() void T 返回类型为T的对象
函数型接口Function R apply(T t) T R 对类型为T的对象进行操作,返回类型为R的对象
断言型接口Predicate boolean test(T t) T boolean 对类型为T的对象进行操作,返回布尔类型结果
 

三、Lambda表达式

Lambda表达式适用于 函数式接口

注意:

  1. 有返回值的Lambda表达式,如果方法体只有一条返回语句,可同时省略return和{}。

  2. 虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。

  3. Lambda 规定接口中只能有一个需要被实现的抽象方法,不是规定接口中只能有一个方法,称为函数式接口。

总结

->左面: 参数类型可以省略不写,自动类型推断。

               ​ 如果只有一个参数,()可以省略不写。

->右侧: {}将方法体的具体内容包裹起来。 

               ​ 方法体中只有一条执行语句,{}可以省略不写。

                如果执行语句就一条return语句,return 和 {}可以同时省略不写。

四、方法引用

Lambda体中仅仅调用一个方法,而没有其他的执行语句,可以使用方法引用

操作符: “::”双冒号

public class TestMethodRef1 {
  public static void main(String[] args) {
    //使用匿名内部类实现
    Consumer consumer = new Consumer<Integer>() {
      @Override
      public void accept(Integer i) {
        System.out.println(i);
      }
    };
    consumer.accept(56);
    
    //使用lambda表达式实现
    Consumer<Integer> consumer1 = (i)->System.out.println(i);
    consumer1.accept(56);
    
    //使用方法引用
    Consumer<Integer> consumer2 = System.out::println;
    consumer2.accept(56);
  }
}

在本示例中,println()的参数类型、返回值类型正好和Consumer接口的accept方法的参数类型、返回值类型相同,此时可以采用方法引用来简化语法。

语法为对象名::实例方法名。

方法引用有下面几种方式:

  1. 对象引用::实例方法名

  2. 类名::静态方法名

  3. 类名::实例方法名

  4. 类名::new (也称为构造方法引用)

  5. 类型[]::new (也称为数组引用)