【java】lambda表达式总结

      

目录

一、面向对象的处理方法

二、函数式编程的处理方法

先使用匿名内部类:

lambda改造:

lambda改造规则

示例:

三、补充:函数式接口


        大家好,我是jstart千语。今天总结一下lambda表达式。lambda表达式在后面的streamAPI和mybatis-plus都用得非常多。是很有必要学习的。

        说白了,lambda表达式就是简化函数式接口匿名内部类的书写。

        什么是函数式接口?就是只有一个抽象方法的接口

        什么是匿名内部类?就是在实参中书写内部类,传递给方法的形参。

 lambda表达式是函数式编程的产物,与我们面向对象编程不同。所以他们的实现方式也会不同。我会从面向对象的方式讲起。

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


一、面向对象的处理方法

对于使用不同的工具来发送消息的功能,如果是使用面向对象的思想,需要先定义一个接口,然后让不同的工具来实现这个接口,并重写它的抽象方法,例如:

接口:

public interface sendMessage {void send();
}

 Email实现类:

public class Email implements sendMessage {@Overridepublic void send() {System.out.println("use email send message");}
}

phone实现类:

public class phone implements sendMessage {@Overridepublic void send() {System.out.println("use phone send message");}
}

具体运行的代码:

public class Main {public static void main(String[] args) {sendMessage email = new Email();//创建email的实例email.send(); //调用实现类的方法}}

输出:


总结:

        显然,如果使用面向对象的思想,要先自己写实现类,然后重写方法,然后创建对象,最好再调用方法。相对来说比较麻烦,特别是某种情况只用一次的时候。



二、函数式编程的处理方法

这是一种简化代码的一种书写风格,可以直接将接口的具体实现写在lambda表达式里,不需要再进行实例化接口、创建对象、调用方法。

比如基于上述的例子,我再补充一个使用WX来发送消息的实现:

先使用匿名内部类:

public static void main(String[] args) {message(new SendMessage() {@Overridepublic void send() {System.out.println("use wx send message");}});}public static void message(SendMessage sendMessage) {sendMessage.send();}

lambda改造:

public static void main(String[] args) {message(() -> {System.out.println("use wx send message");});}public static void message(SendMessage sendMessage) {sendMessage.send();}

lambda改造规则

改造规则遵循:可推导可省略的思想。也就是说如果可以由java推导出来的就可以省略。

具体如下:

  • 从接口名到方法名都可以省略,也就是从new...到方法名都可以省略,参数和方法体之间用 -> 连接。
  • 参数类型可以省略不写
  • 如果只有一个参数,()可以省略;如果参数不止一个,那么()就不能省略,只能省略参数类型
  • 如果方法体只有一行,{}可以省略、return可以省略,方法体内的 ;可以省略

示例:

    public static void main(String[] args) {String result = message("李雷","hello",new SendMessage(){@Overridepublic String send(String user, String message) {System.out.println("send " + message + " to " + user);return "success";}});System.out.println("result: " + result);}public static String message(String user,String message,SendMessage sendMessage) {return sendMessage.send(user, message);}

lambda表达式:

    public static void main(String[] args) {String result = message("李雷","hello",(user, message) -> {System.out.println("send " + message + " to " + user);return "success";});System.out.println("result: " + result);}public static String message(String user,String message,SendMessage sendMessage) {return sendMessage.send(user, message);}

输出:



三、补充:函数式接口

函数式接口就是指只有一个抽象方法的接口,可以使用@FunctionalInterface来标记。

  1. 不加这个注解,只要接口里面只有一个方法,那这个接口也是函数式接口
  2. 加了这个注解,如果接口里面不止一个抽象方法,会报编译错误。
  3. 实际使用中,还是添加这个注解,因为这样可以做到显式地声明,更清楚地知道这个接口的使用意图。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AtCoder Beginner Contest 242 G - Range Pairing Query (莫队)

每周五篇博客:(5/5) 我做到了! https://atcoder.jp/contests/abc242/tasks/abc242_g 这题主要是想给大家提供一份莫队的板子,很多莫队题基本上填空就差不多了( 板子 void solve() {int n;std::cin >…

淘宝商品主图标题api接口

1、输入淘宝商品id或者链接,点查询 2、查询淘宝商品主图,商品标题,商品价格,卖家旺旺 3、支持api接口

文心一言开发指南06——千帆大模型平台新手指南

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 千帆大模型平台为新手用户提供了一个全面的入门指南,以便用户能够快速熟悉平台的操作和功能。千帆大模型平台通过提供详细的新手指南,确保用户能够顺…

Pacman-N-queen

文档 代码及文档:通过网盘分享的文件:code 链接: https://pan.baidu.com/s/1Rgo9ynnEqjZsSP2-6TyS8Q?pwdn99p 提取码: n99p 补充核心代码 核心代码内容: genetic_algorithm,py # -*- coding: utf-8 -*- """ Created on …

常用的多传感器数据融合方法

1. 概述 根据具体需求(实时性、计算资源、噪声特性)选择合适的方法,实际应用中常结合多种方法(如UKF与神经网络结合)。 传统方法 (KF/EKF/UKF/PF)依赖数学模型,适合动态系统&#…

简单几步,开启 Intel VT-x 让电脑“解开CPU封印”

#vmware #虚拟机 #cpu虚拟化 # Intel VT-x 前言 你是不是也遇到过这种情况:在尝试运行虚拟机(VM)、安卓模拟器,或者使用 Windows 沙盒、WSL2 等功能时,遇到了类似“此主机支持 Intel VT-x,但 Intel VT-x …

Go语言--语法基础4--基本数据类型--字符串类型

在 Go 语言中,字符串也是一种基本类型。相比之下, C/C 语言中并不存在原 生的字符串类型, 通常使用字符数组来表示,并以字符指针来传递。 Go 语言中字符串的声明和初始化非常简单,举例如下: var str st…

QT中的事件及其属性

Qt中的事件是对操作系统提供的事件机制进行封装,Qt中的信号槽就是对事件机制的进一步封装 但是特殊情况下,如对于没有提供信号的用户操作,就需要通过重写事件处理的形式,来手动处理事件的响应逻辑 常见的Qt事件: 常见事…

socket套接字-UDP(中)

socket套接字-UDP(上)https://blog.csdn.net/Small_entreprene/article/details/147465441?fromshareblogdetail&sharetypeblogdetail&sharerId147465441&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link UDP服务器…

C++入门小馆: STL 之queue和stack

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

ALTER TABLE 删除DROP表列的报错: 因为有一个或多个对象访问此列

目录 1.问题 2.解决办法 1.问题 删除某个列名的时候,提示错误因为有一个或多个对象访问此列 2.解决办法 2.1 添加或删除表新列名 将表中的字段设置Default 或 NOT NULL 都会给该字段添加约束,增加了这些约束后,再SQL脚本修改类型、删除会发生…

python源码打包为可执行的exe文件

文章目录 简单的方式(PyInstaller)特点步骤安装 PyInstaller打包脚本得到.exe文件 简单的方式(PyInstaller) 特点 支持 Python 3.6打包为单文件(–onefile)或文件夹形式自动处理依赖项 步骤 安装 PyIns…

【2025最近Java面试八股】Spring中循环依赖的问题?怎么解决的?

1. 什么是循环依赖? 在Spring框架中,循环依赖是指两个或多个bean之间相互依赖,形成了一个循环引用的情况。如果不加以处理,这种情况会导致应用程序启动失败。导致 Spring 容器无法完成依赖注入。 例如: Service publi…

JimuBI 积木报表 v1.9.5发布,大屏和仪表盘,免费数据可视化

项目介绍 JimuBI (积木报表BI) 是一款免费的数据可视化产品,含大屏和仪表盘、门户、移动图表,像搭建积木一样完全在线设计! 大屏采用类word风格,可以随意拖动组件,想怎么设计怎么设计,可以像百度和阿里一样…

云原生课程-Docker

一次镜像,到处运行。 1. Docker详解: 1.1 Docker简介: Docker是一个开源的容器化平台,可以帮助开发者将应用程序和其依赖的环境打包成一个可移植的,可部署的容器。 docker daemon:是一个运行在宿主机(DO…

HikariCP 6.3.0 完整配置与 Keepalive 优化指南

HikariCP 6.3.0 完整配置与 Keepalive 优化指南 HikariCP 是一个高性能、轻量级的 JDBC 连接池框架,广泛应用于 Java 应用,尤其是 Spring Boot 项目。本文档基于 HikariCP 6.3.0 版本,详细介绍其功能、配置参数、Keepalive 机制以及优化建议…

基于springboot+vue的摄影师分享交流社区的设计与实现

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

ComfyUI for Windwos与 Stable Diffusion WebUI 模型共享修复

#工作记录 虽然在安装ComfyUI for Windwos时已经配置过extra_model_paths.yaml 文件,但升级ComfyUI for Windwos到最新版本后发现原先的模型配置失效了,排查后发现,原来是 extra_model_paths.yaml 文件在新版本中被移动到了C盘目录下&#x…

【最新版】沃德代驾源码全开源+前端uniapp

一.系统介绍 基于ThinkPHPUniapp开发的代驾软件。系统源码全开源,代驾软件的主要功能包括预约代驾、在线抢单、一键定位、在线支付、车主登记和代驾司机实名登记等‌。用户可以通过小程序预约代驾服务,系统会估算代驾价格并推送附近代驾司机供用户选择&…

react的 Fiber 节点的链表存储

在React Fiber架构中,Fiber节点的链表存储是一种重要的数据结构组织方式,用于管理和遍历Fiber节点。以下是关于Fiber节点链表存储的详细介绍: 链表结构 单链表:React Fiber节点通过next指针形成单链表结构。每个Fiber节点都有一…