• java8新特性-lambda表达式 和 方法引用


    lambda 表达式

    lambda 是一个对象,而不是一个函数。

    // 格式 :
    -> : lambda 操作符 或 箭头操作符
    -> 左边 : lambda 形参列表(其实就是接口中的抽象方法的形参列表)
    -> 右边 : lambda 体(其实就是重写的抽象方法的方法体)
    
    // 举例子 :(o1,o2) -> Integer.compare(o1,o2);
    
    // lambda 本质 :
    作为函数式接口的实例
    所以以前的匿名实现类都可以使用lambda表达式来写
    

    语法格式

    // 格式一 : 没有参数的
    () -> {lambda 体}
    
    // 格式二 :有一个参数,但是没有返回值
    (num) -> {lambda 体}
    
    // 格式三 :只有一个参数时,括号可以省略
    num -> {lambda 体}
    
    // 格式四 :只有一条语句时,return 和 大括号 若有,都可以省略
    (num) -> 返回语句(不需要写 return )
    

    lambda 使用情况

    -> 左边 :

    lambda 形参列表的参数类型可以省略(类型推断),如果 lambda 形参列表只有一个参数,其一对()也可以省略

    -> 右边 :

    lambda 体应该使用一对 {} 包裹,如果 lambda 体中只有一条执行语句(可能是 return 语句),可以省略这一对 {} 和 return 关键字

    函数式接口

    • 只包含一个抽象方法的接口,称为函数式接口

    • 函数式接口都会使用 @FunctionalInterface 注解标识

    • java.util.function 包中有很多 java8 丰富的函数式接口

    java 内置的四大核心函数式接口

    函数式接口参数类型返回类型用途
    ConsumerTvoid对类型为 T 的对象应用操作,包含方法 void accept(T t)
    SupplierT返回类型为 T 的对象,包含方法 T get()
    FuntionTR对类型为 T 的对象应用操作,并返回结果。结果是 R 类型的对象。包含方法 R apply(T t)
    PredicateTboolean确定类型为 T 的对象是否满足某约束,并返回 boolean 值。包含方法 boolean test(T t)

    方法引用 和 构造器引用

    • 方法引用可以看成是 lambda 表达式深层次的
    • 方法引用本质上就是 lambda 表达式,也是函数式接口的实例

    方法引用的要求

    要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型都相同。

    使用格式

    类(对象):: 方法名

    具体分为三种情况

    • 对象 :: 非静态方法
    • 类 :: 静态方法
    • 类 :: 非静态方法
    情况一 :对象 :: 非静态方法
    /**
         * 情况一 :对象::实例方法
         * Consumer 中的 void accept(T t) 方法
         * PrintStream 中的 void println(T t) 方法
         */
    @Test
    public void test1(){
        // 使用 lambda 表达式
        Consumer<String> con1 = str -> System.out.println(str);
        con1.accept("测试1");
        // 使用方法引用...因为输出语句是链式调用,我们有两种方式
        // 方式一 :
        PrintStream ps = System.out;
        Consumer<String> con2 = ps::println;
        con2.accept("测试2");
        // 方式二 :
        Consumer<String> con3 = System.out::println;
        con3.accept("测试3");
    }
    
    情况二 :类 :: 静态方法
    /**
         * 情况二 :类::静态方法
         * Comparator 中的 int compare(T t1,T t2)
         * Integer 中的 int compare(T t1,T t2)
         */
    @Test
    public void test2(){
        // lambda 表达式
        Comparator<Integer> com1 = (o1,o2) -> Integer.compare(o1,o2);
        System.out.println(com1.compare(12,32));
        // 方法引用
        Comparator<Integer> com2 = Integer::compare;
        System.out.println(com2.compare(22,12));
    }
    
    情况三 :类 :: 非静态方法
    /**
         * 情况三 :类 :: 实例方法
         * Comparator 中的 int compare(T t1,T t2)
         * String 中的 int t1.compareTo(T t2) 比较的是ASCII 值
         */
    @Test
    public void test3(){
        // lambda 表达式
        Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);
        System.out.println(com1.compare("a","b"));
        // 方法引用
        Comparator<String> com2 = String :: compareTo;
        System.out.println(com2.compare("b","a"));
    }
    
  • 相关阅读:
    串口字符串转换
    java springboot2.7 写一个本地 pdf 预览的接口
    Rstudio使用mlogti.data函数出现错误Error in guess(varying) : 没有能够从它们的名字中来猜测时变参数,如何解决?
    001、DM8安装
    python的深浅copy
    Rust 构建跨平台 GUI 的新选择
    unity fbx动画按配置切割帧片段
    统一观测丨使用 Prometheus 监控 SQL Server 最佳实践
    安卓APP优化归档
    数字化时代,数据就是资产
  • 原文地址:https://blog.csdn.net/weixin_46047612/article/details/127120268