• 5分钟学会 Lambda 表达式,一篇就够了!


    在写之前,我在考虑是否要写这篇文章,然而当我查阅“lambda表达式”的相关内容的时候,我发现大量的文章都出现了冗余的现象,文章的篇幅过于夸张,严重影响了大家阅读的兴趣,因此我决定写一篇关于lambda表达式的文章,让大家能够在一定程度上对lambda表达式有一定的理解。希望能够对你在Java的学习中起到一定的帮助。

    Lambda概述

    Lambda表达式是JDK8开始后的一种新语法形式

    作用:简化匿名内部类的代码写法

    格式:

    1. (匿名内部类被重写方法的形参列表)->{
    2.     被重写方法的方法体代码
    3. }
    4. 注:->是语法形式,无实际意义

    首先我们先定义一个抽象类,通过匿名内部类重写其方法,再对其进行简化,比较二者之间有何变化:

    使用Lambda表达式之前:

    1. public static void main (String[] args){
    2.     People p = new People(){
    3.     @Override
    4.     public void run(){
    5.         System.out.println("小学生跑的很慢");
    6.         }
    7.     };
    8.     p.run();    
    9.  
    10. }
    11. abstract class People{
    12.     public abstract void run();
    13. }

    使用Lambda表达式之后:

    1. People p = ()->{
    2.     System.out.println("小学生跑的很慢");
    3. };
    4. //会出现报错

    会出现报错,这是为什么呢?原因在于前面对于Lambda表达式的定义并不清晰,Lambda表达式并不能简化所有匿名内部类,其只能简化函数式接口匿名内部类的写法形式,且接口中有且仅有一个抽象方法,通常,我们会再接口上加上一个@Functionalinterface注解,标记该接口必须是满足函数式接口。

    真正意义上通过Lambda表达式简化:

    1. @FunctionalInterface//加上这个注解必须是函数式接口,且只有一个抽象方法
    2. interface People{
    3.     void run();
    4. }
    5. //简化之前的匿名内部类
    6. People p = new People(){
    7.     @Override
    8.     public void run(){
    9.         System.out.println("小学生跑的很慢!");
    10.     }
    11. };
    12. //简化之后
    13. People p = () -> {
    14.         System.out.println("小学生跑的很慢!");
    15. };

    另外,也可以将其作为参数代入方法中去使用:

    1. //在原来的基础上定义一个pk方法
    2. public static void pk(People p){
    3.     System.out.println("跑步情况如何:")
    4.     p.run();
    5. }
    6. //不使用Lambda的情况下:
    7. pk(p);//需要在定义匿名内部类之后,将p代入;
    8. //使用Lambda的情况:
    9. People p = () -> {
    10.         System.out.println("小学生跑的很慢!");
    11. };
    12. pk(() -> {
    13.         System.out.println("小学生跑的很慢!");
    14. });
    15. //由于等号右边即是People创建的对象p,因此可以可以直接将其代入

    Lambda的好处:

    Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升。

    Lambda实战的作用

    在之前的学习过程中,我们学习过了Arrays的相关知识,其中有一个sort方法(可以将数组升序或降序排列),它其实也是接口类,并且只有一个抽象方法:

    1. //精简之前:
    2. Arrays.sort(grade,new Comparator<Integer>(){
    3.     @Override
    4.     public int compare(Integer o1,Integer o2){
    5.         return o2 -o1;
    6. }
    7. });
    8. //精简之后:
    9. Arrays.sort(grade,(Integer o1,Integer o2) -> {
    10.         return o2 -o1;
    11. });

    Lambda表达式省略规则

    参数类型可以省略不写

    1. //参考前面的实战例子
    2. Arrays.sort(grade,(Integer o1,Integer o2) -> {
    3.         return o2 -o1;
    4. });
    5. //省略参数类型之后
    6. Arrays.sort(grade,( o1, o2){
    7.         return o2 -o1;
    8. });

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

    1. //简单引用一个单个参数的例子,不需要了解其具体含义
    2. btn.addActionListener((ActionEvent e) -> {
    3.     System.out.println("我是简单的例子。");
    4. });
    5. //简化之后:
    6. btn.addActionListener( e -> {
    7.     System.out.println("我是简单的例子。");
    8. });

    如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号

    1. //参照上一条规则的例子
    2. btn.addActionListener( e -> {
    3.     System.out.println("我是简单的例子。");
    4. });
    5. //简化之后:
    6. btn.addActionListener( e -> System.out.println("我是简单的例子。") );

    如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写

    1. //参照第一条规则的代码
    2. Arrays.sort(grade,(Integer o1,Integer o2) -> {
    3.         return o2 -o1;
    4. });
    5. //简化之后:
    6. Arrays.sort(grade,( o1, o2)-> o2 -o1);
  • 相关阅读:
    Redis -- SpringBoot集成Redis
    网站安全防护
    Docker启动失败报错Failed to start Docker Application Container Engine解决方案
    伸展树(二) - C++实现
    EPICS自定义设备支持--longin记录的异步设备支持编写
    ui设计师简历自我评价的范文(合集)
    Ego-Swarm编译与运行
    智能算力AI破局 英特尔携手百度飞桨,共话AI技术创新引领新征程
    java计算机毕业设计车辆保险平台系统研究与设计源码+mysql数据库+系统+lw文档+部署
    干货分享|使用 Istio 实现灰度发布
  • 原文地址:https://blog.csdn.net/m0_71777195/article/details/127612742