Java知识点整理 18 — Lambda表达式

一. 简介

Lambda 表达式是函数式编程思想的体现,强调做什么,而不是以什么方式去做。

面向对象编程思想强调的是对象,必须通过对象的形式来做一些事情。比如多线程执行任务,需要创建对象,对象需要实现指定接口,然后再执行等。过程相对繁琐。而如果使用函数式编程思想,可以直接通过传递一段代码给线程对象执行,不需要创建任务对象。

Lambda 表达式可以被视为匿名函数,允许在需要函数的地方以更简洁的方式定义功能

因此只要是函数式接口,就可以使用 Lambda 表达式简化。

函数式接口指的是接口中有且只有一个未实现的方法。如果超过一个,则不是函数式接口;如果有一个默认实现方法,一个未实现的方法,也是函数式接口。

// 接口中有超过一个未实现方法,不是函数式接口
interface MyInterface {
    int sum(int a, int b);
    int min(int a, int b);
}

// 接口中只有一个未实现的方法,是函数式接口
interface MyCase{
    int hello();
    default int hello(int a){return a;} //默认实现
}

可以用 JDK 中提供的检查注解 @FunctionalInterface 来检查该接口是否为函数式接口。

正常情况下:

异常情况下:

 二. Lambda 表达式的格式

1. 标准格式

( 参数列表 )-> { 代码 }

2. 格式说明

小括号内是参数列表,语法与传统方法参数列表一致,没有参数就留空,有多个就用逗号分隔。

箭头符号 ->,代表指向动作。

大括号内是业务逻辑代码,语法与传统方法体一致。

3. 举例

创建线程

// 传统方式
Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run () {
       System.out.println("线程需要执行的任务代码1");
    }
});
thread1.start();
 
// Lambda表达式
Thread t2 = new Thread(()->{
    System.out.println("线程需要执行的任务代码2");
});
t2.start();

比较器

List<Integer> list = new ArrayList<>();
Collections.addAll(list,11,22,33,44,55);
System.out.println("排序之前的集合:" + list);
        
// 传统方式
Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare (Integer o1, Integer o2) {
        return o2-o1;
    }
});
 
// Lambda表达式
Collections.sort(list,(Integer o1, Integer o2)->{return o2-o1;});
System.out.println("排序之后的集合:" + list);

三. Lambda 表达式与函数式接口

假如有一个接口 MyInterface,里面有一个方法 sum(),

interface MyInterface {
    int sum(int a, int b);
}

想要实现这个接口,有两种方法:

1. 自己写实现类

class MyInterfaceImpl implements MyInterface {
    @Override
    public int sum(int a, int b) {
        return a + b;
    }
}

然后调用,

public class Lambda {
    public static void main(String[] args) {
        MyInterface myInterface = new MyInterfaceImpl();
        int result = myInterface.sum(1, 2);
        System.out.println(result);
    }
}

2. 创建匿名实现类

每个接口都去写对应的实现类相对麻烦,因此可以采用匿名实现类动态的去实现接口

public class Lambda {
    public static void main(String[] args) {

        // 1. 自己创建实现类对象
        MyInterface myInterface = new MyInterfaceImpl();
        int result = myInterface.sum(1, 2);
        System.out.println("自己创建的实现类对象 " + result);

        // 2. 创建匿名实现类
        MyInterface myInterface1 = new MyInterface() {
            @Override
            public int sum(int a, int b) {
                return a*a + b*b;
            }
        };
        int result1 = myInterface1.sum(1, 2);
        System.out.println("匿名实现类 " + result1);
    }
}

在匿名实现类中,很多格式上的东西都是固定的,因此可以进一步简化,只保留动态的东西,比如参数、方法体内容等,

// 2. 匿名实现类
MyInterface myInterface1 = new MyInterface() {
    @Override
    public int sum(int a, int b) {
       return a*a + b*b;
    }
};

// 3. Lambda表达式实现接口  参数列表 + 箭头 + 方法体
MyInterface myInterface2 = (int a, int b) -> {
    return a * a + b * b;
};

进一步思考,其实参数类型也是固定的,还可以再简化,

MyInterface myInterface3 = (x, y) -> {
     return x * x + y * y;
};

参数名不一定是接口中定义的(a,b),也可以是其它名字,比如(x,y)。

此外,参数部分如果为空,可以留空,即只写一个(),但不能不写括号;或者如果只有一个参数,可以只写一个参数名,

// 入参为控
interface MyCase1{
    int hello();
}

public class Lambda {
    public static void main(String[] args) {
        MyCase myCase1 = () -> {
            return 1;
        };
    }
}

// 只有一个参数 a
interface MyCase2{
    int hello(int a);
}

public class Lambda {
    public static void main(String[] args) {
        MyCase1 myCase2 = a -> {
            return a + 1;
        };
    }
}

方法体如果只有一句话,{ } 和 return 可以省略,

interface MyCase2{
    int hello(int a);
}

public class Lambda {
    public static void main(String[] args) {
        MyCase1 myCase2  = a ->  a + 2;
        // 调用方法
        System.out.println(myCase2.hello(1));
    }
}

四. Lambda 表达式的表现形式 

1. 变量形式

变量的类型为函数式接口(不常用)

// 变量的形式
Runnable r = ()->{
    System.out.println("任务代码");
};
// 函数式接口类型的变量
Thread t = new Thread(r);

2. 参数形式

方法的形参类型为函数式接口(常用)

// 变量的形式-比较器
Comparator<Integer> comparable = (o1, o2)->{return o2 - o1;};

// 创建集合
ArrayList<Integer> list = new ArrayList<>();

// 存入数据
Collections.addAll(list,11,22,33,44,55);
 
// 将函数式接口类型的形参类型,传给Collections
Collections.sort(list,comparable);

3. 返回值形式

方法的返回值类型为函数式接口(常用)

// 定义一个方法
public static Comparator<Integer> getComparator(){
     return (Integer o1,Integer o2)->{return  o2-o1;};
}
        
public static void main (String[] args) {
   // 返回值形式
   Collections.sort(list,getComparator());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/766487.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust监控可观测性

可观测性 在监控章节的引言中&#xff0c;我们提到了老板、前端、后端眼中的监控是各不相同的&#xff0c;那么有没有办法将监控模型进行抽象、统一呢&#xff1f; 来简单分析一下&#xff1a; 业务指标实时展示&#xff0c;这是一个指标型的数据( metric )手机 APP 上传的数…

若依 ruoyi vue上传控件 el-upload上传文件 判断是否有文件 判断文件大小

console.info(this.$refs.upload.uploadFiles.length)//this.$refs.upload.uploadFiles.length 获取当前上传控件中已选择的文件大小//判断是否存在已上传文件 if(this.$refs.upload.uploadFiles.length 0){this.$modal.msgWarning("请上传文件");return; }

轻松配置,无需重复操作:PyCharm新建项目后,如何让当前新建项目使用既有虚拟环境

1、点击右上角的设置按钮 2、点击Settings 3、点击profect 4、点击python Interprter&#xff0c;这个是python解释器 5、点击 add interpreter&#xff0c;这个是增加python解释器 6、再点击add Local interpreter 7、选择第一个Virtualenv Environment,然后选择Existin…

交叉编译tslib库和上机测试

目录 一、tslib 介绍 二、tslib 框架分析 三、交叉编译、测试 tslib 1.安装工具链 tslib &#xff08;1&#xff09;设置交叉编译工具链 &#xff08;2&#xff09;进入tslib目录 &#xff08;3&#xff09;安装工具链 &#xff08;4&#xff09;确定工具链中头文件、库…

Linux源码阅读笔记09-进程NICE案例分析1

task_nice task_nice函数功能&#xff1a;获取某个进程的nice值&#xff0c;其中nice值为进程的优先级&#xff0c;与静态优先级有关&#xff08;nicestatic_prio-120&#xff09;。 nice的取值范围&#xff1a;-20 ~ 19 内核源码 根据内核的注释可以知道&#xff1a;task_n…

13-Django项目--文件上传

目录 前端展示 路由: 数据库字段: 函数视图: 前端展示 {% extends "index/index.html" %}{% block content %}<div class"container"><input type"button" id"btnAdd" value"上传荣耀" class"btn btn-succ…

鼠标点击器免费版?详细介绍鼠标连点器的如何使用

随着科技的发展&#xff0c;鼠标连点器逐渐成为了我们生活和工作中不可或缺的工具。它不仅能够帮助我们完成频繁且重复的点击任务&#xff0c;还能在很大程度上减少我们的手部疲劳&#xff0c;提高工作效率。本文将详细介绍鼠标连点器的使用方法&#xff0c;并推荐三款好用的免…

to_json 出现乱码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

来咯,他来咯 看GitHub Codespaces 如何帮助缩短开发设置时间

在快节奏的软件开发世界中&#xff0c;效率和速度起着重要作用。对于开发人员来说&#xff0c;设置开发环境可能是一项耗时的任务。GitHub Codespaces 是一个基于云的环境&#xff0c;旨在通过提供对配置设置的访问来应对这一挑战。 本指南将帮助你开始使用 GitHub Codespaces …

Spring boot 更改启动LOGO

在resources目录下创建banner.txt文件&#xff0c;然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …

【面试干货】值传递与引用传递:理解Java中的参数传递机制

【面试干货】值传递与引用传递&#xff1a;理解Java中的参数传递机制 1、值传递&#xff08;Call by Value&#xff09;2、引用传递&#xff08;Call by Reference&#xff09;3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 值传递…

【Python】已解决:ERROR: No matching distribution found for JPype1

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ERROR: No matching distribution found for JPype1 一、分析问题背景 在安装Python的第三方库时&#xff0c;有时会遇到“ERROR: No matching distribution fo…

金融科技在反洗钱领域的创新应用

随着金融市场的不断发展和全球化趋势的加速&#xff0c;洗钱活动日益猖獗&#xff0c;给金融机构和社会经济安全带来了严重威胁。为了有效应对这一挑战&#xff0c;金融科技在反洗钱领域的应用逐渐崭露头角&#xff0c;为打击洗钱活动提供了强有力的技术支持。本文将从多个角度…

Python编写简单爬虫

文章目录 Python编写简单爬虫安装必要的库编写爬虫代码解析和存储数据注意事项 Python编写简单爬虫 安装必要的库 在开始编写爬虫之前&#xff0c;你需要安装一些必要的库。我们将使用requests库来发送HTTP请求&#xff0c;使用BeautifulSoup库来解析HTML内容。你可以使用以下…

气象观测站应设置在何处:选址的科学与策略

气象观测站在现代社会中扮演着至关重要的角色&#xff0c;它们不仅是气象数据的收集中心&#xff0c;也是气象预报和灾害预警的基础。然而&#xff0c;一个成功的气象观测站&#xff0c;其选址并不是随意的&#xff0c;而是需要综合考虑多种因素&#xff0c;以确保数据的准确性…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《面向电网调峰的电动汽车聚合商多层级实时控制策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

编译调试swift5.7源码

环境&#xff1a; 电脑&#xff1a;apple m1 pro系统&#xff1a;macOS13Xcode: 14.2Cmake: 3.25.1Ninja: 1.11.1sccache: 0.3.3python: 3.10 (如果你的mac不是这个版本&#xff0c;可以通过 brew install python3.10下载&#xff0c;然后看这篇文章切换到该python版本)swift代…

SQL语言基础特点、数据库系统

一、SQL的概述 &#xff08;1&#xff09; SQL全称&#xff1a; Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 &#xff08;2&#xff09;SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公…

Ubuntu20.04 有线网络图标消失解决方案

Ubuntu20.04 有线网络图标消失解决方案 问题描述&#xff1a; ubuntu20.04系统提示的software updater有软件包更新&#xff0c;按提示安装更新软件包&#xff0c;重启系统后&#xff0c;ubuntu系统的网络图标消失不见&#xff1b;无法正常上网&#xff1b;检查网口&#xff0…