当前位置: 首页 > article >正文

【Java】—— 函数式编程:Lambda表达式、方法引用

目录

一、什么是Lambda表达式?

二、Lambda表达式使用规则

1、参数类型可以全部省略

2、如果只有一个参数,参数类型省略的同时"()"也可以省略

3、如果方法体中只有一行代码,大括号{}可以省略,同时省略";",如果有return,也必须省略

三、方法引用

1、静态方法引用

2、实例方法引用

3、构造器引用


一、什么是Lambda表达式?

JDK 8开始新增的一种语法形式,可以替代匿名内部类对象,让程序更简洁。

注意:只能替代函数式接口(有且仅有一个抽象方法的接口)的匿名内部类!!

二、Lambda表达式使用规则

1、参数类型可以全部省略

A a1 = (m,n) -> {
            return m+n;
        };

2、如果只有一个参数,参数类型省略的同时"()"也可以省略

B b1 = c -> {
            System.out.println("省略()");
        } ;

3、如果方法体中只有一行代码,大括号{}可以省略,同时省略";",如果有return,也必须省略

        A a2 = (m,n) -> m+n;

三、方法引用

使用已经存在的方法,作为函数式接口中抽象方法的方法体。

//        匿名内部类写法
        calculateAndPrint(new Computer() {
            @Override
            public double pow(double x, double y) {
                return Math.pow(x, y);
            }
        });
//        lambda写法
        calculateAndPrint((double a,double b) -> {return Math.pow(a,b);});
//        lambda省略写法
        calculateAndPrint((a,b)->Math.pow(a,b));
//        方法引用写法
        calculateAndPrint(Math::pow);

方法引用有静态方法引用、实例方法引用、构造方法引用

1、静态方法引用

使用格式:

类名 :: 静态方法

使用场景:

某个Lambda表达式里只是调用一个静态方法,并且“→”前后参数的形式一致

//        匿名内部类写法
        calculateAndPrint(new Computer() {
            @Override
            public double pow(double x, double y) {
                return Math.pow(x, y);
            }
        });
//        lambda省略写法
        calculateAndPrint((a,b)->Math.pow(a,b));
//        方法引用写法
        calculateAndPrint(Math::pow);

2、实例方法引用

1)使用格式:

对象名 :: 实例方法

使用场景:

某个Lambda表达式里只是通过对象名称调用一个实例方法,并且“→”前后参数的形式一致

//    使用匿名内部类
        Arrays.sort(student, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();
            }
        });
//        使用lambda表达式
        Arrays.sort(student, (o1, o2) -> o1.getAge() - o2.getAge());
//        使用方法引用
        Arrays.sort(student, new StudentComputer()::subAge);

2)使用格式:

类名 :: 实例方法

使用场景:

某个Lambda表达式里只是通过对象名称调用一个实例方法,同时参数列表中的第一个参数就是调用实例方法的对象, 并且“→”前后剩余参数的形式一致

//        匿名内部类
        convertAndPrint(new Convert() {
            @Override
            public String convert(String source, String oldStr, String newStr) {
                return source.replace(oldStr,newStr);
            }
        }, "四月天行健", "四", "五");
//        lambda写法
        convertAndPrint(((source, oldStr, newStr) -> source.replace(oldStr,newStr)),"北京","北","南");
//        方法引用
        convertAndPrint(String::replace,"JavaEE","JavaEE","Harmony");

3、构造器引用

使用格式:

类名 :: new

使用场景:

某个Lambda表达式里只是在创建对象,并且“→”前后参数情况一致

//        匿名内部类
        createStringAndPrint(new StringFactory() {
            @Override
            public String createString(byte[] bytes) {
                return new String(bytes);
            }
        }, bys);
//        lambda
        createStringAndPrint(bytes -> new String(bytes),bys);
//        方法引用
        createStringAndPrint(String::new,bys);


http://www.kler.cn/a/389825.html

相关文章:

  • 使用pytest+openpyxl做接口自动化遇到的问题
  • jenkins提交gitee后自动部署
  • 【Spring】@Autowired与@Resource的区别
  • react 中 FC 模块作用
  • 计算机毕业设计必看必学35755flask旅游景区热度可视化平台原创定制程序,java、PHP、python、小程序、文案全套、毕设成品等
  • Ue5 umg学习(一)
  • 如何在 CentOS 6 上设置 NFS 挂载
  • 22.04Ubuntu---ROS2使用rclcpp编写节点C++
  • echarts:当前柱状图默认显示两个,拖拽后显示其他的柱状,请问怎么默认显示所有的?
  • 深入理解TCP/IP协议
  • React融合css
  • caozha-whois(域名Whois查询源码)
  • 模型解释新方向!浙大揭秘LLM隐层之间的知识流动!
  • 使用 FFmpeg 进行音视频转换的相关命令行参数解释
  • 解决C盘空间不足的三种方案
  • 使用LNMP搭建私有云存储
  • C/C++中指针
  • 【MATLAB源码-第209期】基于matlab的MSK调制解调仿真,对比三种解调方法的误码率分别是相干解调,1比特差分,2比特差分。
  • MSTP多实例生成树:避免单点设备故障,流量负载均衡。
  • SDL线程
  • 了解什么是数据库(简介)
  • 数据结构与算法:双指针之“最长连续不重复子序列” +位运算之“求二进制中第k个数字”、“求二进制表示”、“二进制中1的个数” +整数离散化
  • 在PyCharm中打包Python项目并将其运行到服务器上的方法
  • 15分钟学 Go 第 47 天 :并发进阶——深入了解Go语言的并发模型!
  • 【Go】-gRPC入门
  • gitlab ci/cd搭建及使用笔记