首页 > 编程语言 >java -- Lambda表达式详细介绍

java -- Lambda表达式详细介绍

时间:2024-07-31 18:53:15浏览次数:19  
标签:java name -- Person new public 表达式 Lambda

java中的Lambda表达式是Java 8引入的一个重要特性,它提供了一种清晰且简洁的方式来表示单个方法的接口(也被称为函数式接口)的实例。Lambda表达式使得编写匿名内部类(尤其是那些仅实现了一个方法的接口)变得更加简洁和易于理解。

基本语法

Lambda表达式的基本语法如下:

(parameters) -> expression

或者对于包含多条语句的情况:

(parameters) -> { statements; }
  • parameters:参数列表。参数的类型可以省略(称为类型推断),但如果有多个参数,则必须用小括号括起来。
  • ->:Lambda操作符,将参数列表与Lambda体分隔开。
  • expression/statements:Lambda体,可以是单个表达式(该表达式的计算结果会自动返回),也可以是一个代码块(需要显式地使用return语句返回结果,如果方法签名指定了返回类型的话)。
public class Demo01Lambda {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我执行了");
            }
        }).start();

        System.out.println("============");
        
        new Thread(()-> System.out.println("我执行了")).start();

        ArrayList<String> list = new ArrayList<>();
    }
}

Lambda表达式的编写步骤

  1. 识别函数式接口:首先,观察是否有函数式接口作为方法的参数进行传递。函数式接口是只包含一个抽象方法的接口(可以使用@FunctionalInterface注解进行标记,但这不是强制的)。
  2. 考虑使用Lambda表达式:如果确认参数是函数式接口,那么可以考虑使用Lambda表达式来简化代码。Lambda表达式提供了一种简洁的方式来实现这个接口。
  3. 转换匿名内部类:原本可能需要通过匿名内部类来传递实参给方法,现在可以使用Lambda表达式来替代。首先,定位到匿名内部类的声明处(从new 接口名()开始到重写的方法体结束)。
  4. 删除不必要的部分:选中整个匿名内部类的代码块,除了重写的方法体内容外,删除new 接口名()、接口名、方法名后的括号、以及方法的返回类型声明(如果Lambda表达式能够通过上下文推断出返回类型)。不要忘记最后删除一个多余的右大括号。
  5. 添加Lambda操作符:在保留的参数列表和方法体之间,插入Lambda操作符->。这标志着Lambda表达式的开始。

Lambda表达式的省略规则(优化表述)

  1. 参数类型省略:在Lambda表达式中,如果编译器能够根据上下文推断出参数的类型,那么可以省略参数的类型声明。
  2. 单参数小括号省略:如果Lambda表达式只接受一个参数,那么包围该参数的小括号可以省略,但参数名仍需保留。
  3. 单语句大括号和分号省略:如果Lambda表达式的方法体只包含一条语句,那么可以省略方法体的大括号和分号。此时,如果这条语句是一个表达式,其值将作为Lambda表达式的返回值。
  4. 返回值省略:如果Lambda表达式的方法体只有一条返回语句,并且该语句的返回值类型与Lambda表达式声明的返回类型兼容,那么可以省略return关键字以及该语句后的分号。Lambda表达式将自动返回该表达式的值。

案列

定义一个类

public class Person {
   private String name;
   private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

定义实现类 , 写 Lambda表达式

public class Demo03Lambda {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("张三",10));
        list.add(new Person("李四",8));
        list.add(new Person("王五",9));

       /* Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge()-o2.getAge();
            }
        });
*/
        System.out.println("=============Lambda==========");

      /*  Collections.sort(list,(Person o1, Person o2)-> {
                return o1.getAge()-o2.getAge();
        });*/

        System.out.println("===========Lambda表达式简化形式==========");

        Collections.sort(list,(o1, o2)-> o1.getAge()-o2.getAge());
        System.out.println(list);
    }
}

标签:java,name,--,Person,new,public,表达式,Lambda
From: https://blog.csdn.net/xiugtt6141121/article/details/140830095

相关文章

  • Java计算机毕业设计健身房管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着健康意识的不断提升,健身房已成为现代人追求健康生活的重要场所。然而,随着会员数量的激增和健身项目的多样化,传统的人工管理方式已难以满足健身房......
  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述VideoTimingCont......
  • 【视频讲解】Python用LSTM、Wavenet神经网络、LightGBM预测股价
    原文链接:https://tecdat.cn/?p=37184原文出处:拓端数据部落公众号 分析师:YuyanYe在金融科技的浪潮中,量化投资方法以其数据驱动和模型导向的特性,日益成为资本市场分析的重要工具。特别是,长短期记忆网络(LSTM)、Wavenet以及LightGBM等先进的机器学习算法,因其在时间序列预测中的卓......
  • Java还是C#?我该如何选择?给年轻人的建议...
    一.年轻人应该通吃其实这不应该是我们真正的主题,而且入了行的也很少会java还是c#这么比,但初学的,java和c#往往就代表了两大流派,java代替了j2ee,c#代替了.net,ok,没有关系,这么作为title,不影响我们说事。C#和Java这俩代码风格常相似,小孩子和老人才做选择,年轻人当然通吃!本人老年不正经......
  • 企业数字化转型的必备钥匙:数据思维|专题报告集
    原文链接:https://tecdat.cn/?p=37165本质上来讲,企业数字化转型,不仅是技术方面的升级,更是企业文化、思维方式的转变。那么,企业数字化转型究竟需要什么样的思维方式?企业数字化转型,需要什么样的思维方式?不知道你有没有过这样的感觉:不知道从什么时候开始,和人沟通过程,以及要说服别人......
  • Invertible Bracket Sequences
    看到这种类似的括号匹配的题目,一定要想到卡特兰数的证明过程呀(将(看成\(1\),)看成\(-1\),于是不难得出充分条件,虽然这道题目并不是直接这么给的,但是我看没人证明)剩下的看官方题解就好了,之所以可以删掉官方题解所说的\(x\),是因为接下来如果\(x\)是\(r_1\)的答案候选项的话,由于\(r_1>......
  • 【PHP系列】内存马(一)不死马
    实验环境工具phpstudy一、内存马概念内存马是无文件攻击的一种常用手段,利用中间件的进程执行某些恶意代码。首先要讲的是PHP不死马,实质上就是直接用代码弄一个死循环,强占一个PHP进程,并不间断的写一个PHPshell,或者执行一段代码二、不死马剖析test.php:<?phpset_tim......
  • element-plus中el-container组件的重要用法详解
    el-container是ElementPlusUI框架中的一个布局容器组件,用于实现页面的布局结构。它主要用于管理和组织页面中的内容,提供了灵活的布局方式。下面详细解释一下el-container的重要用法和特性:1.基本用法el-container提供了三种基本布局方式:horizontal、vertical和vertica......
  • 六种方式涵盖了Vue 3中定义和使用模板的主要方法
    1.单文件组件(SFC)单文件组件(SingleFileComponent,SFC)是Vue组件开发中最常见的方式。使用.vue文件来定义一个组件,包含<template>、<script>和<style>块。示例1<template>2<div>3<p>{{message}}</p>4</div>5</template>6......
  • openvslam ros版本编译
    https://blog.csdn.net/plejahhshsh/article/details/126002268 编译catkin_make-DUSE_PANGOLIN_VIEWER=ON-DUSE_SOCKET_PUBLISHER=OFF sourcedevel/setup.bash 指令1)将图像更改为话题发布出去roscorerosrunimage_publisherimage_publisher......