• 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"));
    }
    
  • 相关阅读:
    2023CCPC哈尔滨站
    知识蒸馏 pytorch官网源码分析
    学习python的第7天,她不再开放她的听歌榜单
    01--nginx基础
    Adobe Premiere基础-常用的视频特效(十五)
    Shell 脚本编程(二) —— 条件判断 (test命令) + 多路分支语句(if 、case)
    ​“FTX 传奇曾经大佬 SBF 的审判:密友出庭指控,陪审团选择延长,听证会揭示 “
    angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
    Qt TCP网络编程基本教程
    8.8本周总结
  • 原文地址:https://blog.csdn.net/weixin_46047612/article/details/127120268