Lamda表达式

 为什么要使用lamda表达式

  • 避免匿名内部类定义过多
  • 可以让你的代码看起来很简洁
  • 去掉了一堆没有意义的代码,只留下核心的逻辑

 函数式接口

理解Functionalnterface (函数式接口)是学习Java8 lambda表达式的关键所在.

定义: 

任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。

 

对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。

通过外部类实现接口

如下所示,在下面定义一个函数式接口,就是定义一个接口,定义一个方法,再定义一个实现类实现方法,再在main方法通过接口创建该实现类,调用实现方法。

/*** 推导lamada表达式*/
public class TestLambda1 {public static void main(String[] args) {testin testcl=new testcl();testcl.lambda();}
}//1.定义一个函数式接口
interface testin{void lambda();
}
//2.实现类
class testcl implements testin{@Overridepublic void lambda() {System.out.println("hello lambda");}
}

成功输出 

通过静态内部类实现接口 

现在要想办法将其优化,将该实现类放到类的内部

 在公共类内部定义一个静态内部类实现了接口,并且也没有问题。

/*** 推导lamada表达式*/
public class TestLambda1 {//3.静态内部类static   class testcl2 implements testin{@Overridepublic void lambda() {System.out.println("hello lambda2");}}public static void main(String[] args) {testin testcl=new testcl();testcl.lambda();testcl=new testcl2();testcl.lambda();}
}//1.定义一个函数式接口
interface testin{void lambda();
}
//2.实现类
class testcl implements testin{@Overridepublic void lambda() {System.out.println("hello lambda");}
}

 

通过局部内部类实现接口

在main方法内部实现外部接口。

/*** 推导lamada表达式*/
public class TestLambda1 {//3.静态内部类static   class testcl2 implements testin{@Overridepublic void lambda() {System.out.println("hello lambda2");}}public static void main(String[] args) {testin testcl=new testcl();testcl.lambda();testcl=new testcl2();testcl.lambda();//4.局部内部类class testcl3 implements testin{@Overridepublic void lambda() {System.out.println("hello lambda3");}}testcl=new testcl3();testcl.lambda();}
}//1.定义一个函数式接口
interface testin{void lambda();
}
//2.实现类
class testcl implements testin{@Overridepublic void lambda() {System.out.println("hello lambda");}
}

 通过匿名内部类实现接口

在main方法内借助接口或者父类直接创建一个匿名实现类的实例,

/*** 推导lamada表达式*/
public class TestLambda1 {//3.静态内部类static   class testcl2 implements testin{@Overridepublic void lambda() {System.out.println("hello lambda2");}}public static void main(String[] args) {testin testcl=new testcl();testcl.lambda();testcl=new testcl2();testcl.lambda();//4.局部内部类class testcl3 implements testin{@Overridepublic void lambda() {System.out.println("hello lambda3");}}testcl=new testcl3();testcl.lambda();//5.匿名内部类,没有类的名称,必须借助接口或者父类testcl= new testin(){@Overridepublic void lambda() {System.out.println("hello lambda4");}};testcl.lambda();}
}//1.定义一个函数式接口
interface testin{void lambda();
}
//2.实现类
class testcl implements testin{@Overridepublic void lambda() {System.out.println("hello lambda");}
}

通过lambda表达式创建实现类

/*** 推导lamada表达式*/
public class TestLambda1 {//3.静态内部类static   class testcl2 implements testin{@Overridepublic void lambda() {System.out.println("hello lambda2");}}public static void main(String[] args) {testin testcl=new testcl();testcl.lambda();testcl=new testcl2();testcl.lambda();//4.局部内部类class testcl3 implements testin{@Overridepublic void lambda() {System.out.println("hello lambda3");}}testcl=new testcl3();testcl.lambda();//5.匿名内部类,没有类的名称,必须借助接口或者父类testcl= new testin(){@Overridepublic void lambda() {System.out.println("hello lambda4");}};testcl.lambda();//6.用lambda简化testcl=()->{System.out.println("hello lambda5");};testcl.lambda();}
}//1.定义一个函数式接口
interface testin{void lambda();
}
//2.实现类
class testcl implements testin{@Overridepublic void lambda() {System.out.println("hello lambda");}
}

简化过程 

外部类->静态内部类->局部内部类->匿名内部类->lambda表达式

lambda只需要关注抽象方法的实现。

达到了使代码更简洁的要求,去掉了没有意义的代码,只留下了核心逻辑。

        //6.用lambda简化testcl=()->{System.out.println("hello lambda5");};

lombda实现带参数的接口并进行再次简化

和不带参数的相比就是在前面的括号里面加上了抽象方法的参数。

这里的两个简化都是可行的

public class TestLambda2 {public static void main(String[] args) {ILove love=(int a)->{System.out.println("I love you---->"+a);};//简化1.去除参数类型love=(a)->{System.out.println("I love you---->"+a);};//简化2.去除括号love= a->{System.out.println("I love you---->"+a);};//简化3.去除花括号love= a-> System.out.println("I love you---->"+a);//总结://lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行就要用代码块包裹。//前提是必须是函数式接口(只有一个方法)//多个参数也可以去掉参数类型,要去掉就都去掉,但必须加上括号love.love(2);}
}
interface ILove{void love(int a);
}
总结:lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行就要用代码块包裹。前提是必须是函数式接口(只有一个方法)
多个参数也可以去掉参数类型,要去掉就都去掉,但必须加上括号

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

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

相关文章

多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测

多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测。 模型描…

Java小白基础自学阶段(持续更新...)

引言 Java作为一门广泛应用于企业级开发的编程语言,对初学者来说可能会感到有些复杂。然而,通过适当的学习方法和资源,即使是小白也可以轻松掌握Java的基础知识。本文将提供一些有用的建议和资源,帮助小白自学Java基础。 学习步骤…

cpolar做一个内网穿透

因为不在公司,需要访问公司的数据库,所以做一个内网穿透 下载安装 下载地址: https://dashboard.cpolar.com/get-started 下载后是个压缩包,解压后傻瓜式安装 操作隧道 安装后打开Cpolar Web UI 登录账号,查看隧…

【头歌】构建哈夫曼树及编码

构建哈夫曼树及编码 第1关:构建哈夫曼树 任务描述 本关任务:构建哈夫曼树,从键盘读入字符个数n及这n个字符出现的频率即权值,构造带权路径最短的最优二叉树(哈夫曼树)。 相关知识 哈夫曼树的定义 设二叉树具有n个带权值的叶子结点{w1,w2,...,wn},从根结点到每个叶…

淘宝API技术解析,实现关键词搜索淘宝商品(商品详情接口等)

淘宝提供了开放平台接口(API)来实现按图搜索淘宝商品的功能。您可以通过以下步骤来实现: 获取开放平台的访问权限:首先,您需要在淘宝开放平台创建一个应用,获取访问淘宝API的权限。具体的申请步骤和要求可以…

图文并茂:Python Tkinter从入门到高级实战全解析

目录 介绍什么是Tkinter?准备工作第一个Tkinter程序界面布局事件处理补充知识点 文本输入框复选框和单选框列表框弹出对话框 综合案例:待办事项列表总结 介绍 欢迎来到本篇文章,我们将带您深入了解如何在Python中使用Tkinter库来创建图形用…

cortex-A7 SPI实验 --- STM32MP157

实验目的: 1、数码管显示相同的值 0000 1111 ......9999 2、数码管显示不同的值 1234 一,SPI概念 1,SPI总线是 全双工三线 / 四线同步串行总线,有两根单向数据线(MOSI ,MISO),一根设备片选线&#xff0…

Meta AI发布SeamlessM4T模型,支持转录和翻译近100种语言|已开源

一、前言 Meta AI 近期的重磅动作频频不断,短短一个多月的时间接连发布了一系列开源大模型,下面我们看看都有哪些有影响力的产品。 2023 年 7 月 14 日 Meta AI 隆重推出 CM3leon,这是一款首个多模态模型,可实现最先进的文本到…

leetcode 767. Reorganize String(重组字符串)

重新排列字符串s中的字母,使得任意两个相邻的字母都不相同。 思路: 让相邻字母不同,能想到的办法是先把相同的字母排列, 然后在相同字母的缝隙中插入另一种字母。 比如"aab", 先把"a a"排出来,再…

5G与4G的RRC协议之异同

什么是无线资源控制(RRC)? 我们知道,在移动通信中,无线资源管理是非常重要的一个环节,首先介绍一下什么是无线资源控制(RRC)。 手机和网络通过无线信道相互通信,彼此交…

GPIO输入-外电检测

前言 (1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。 (2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片…

数据结构-链表

吐槽一下: 在我第一次看到链表这个东西的时候,我觉得数据结构好难啊,怎么这么难理解啊,这是什么玩意啊,结果慢慢的我才发现,链表是除了顺序表最简单的一个数据结构了;我以为我学完了链表&#x…

登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)

会话技术方案选择和对比 一、背景说明二、会话技术之 Cookie1、为什么说cookie是客户端会话技术2、cookie的优点和缺点 三、会话技术之 Session1、为什么说Session是服务端会话技术2、session的优点和缺点 四、令牌技术JWT1、JWT 的原理2、JWT的优点和缺点 一、背景说明 在开发…

科大讯飞笔试编程第二题(处理Scanner不能先输入数字再输入字符串问题)

问题: 在使用scanner的时候如果先读取一个数字,在读取一行带有空格的字符串,势必会出错或者字符串读不到 public static void main(String[] args) {Scanner scanner new Scanner(System.in);int x scanner.nextInt();String s scanner.n…

【C++杂货铺】探索vector的底层实现

文章目录 一、STL1.1 什么是STL?1.2 STL的版本1.3 STL的六大组件 二、vector的介绍及使用2.1 vector的介绍2.2 vector的使用2.2.1 vector的定义2.2.2 vector iterator2.2.3 vector空间增长问题2.2.4 vector增删查改 2.3 vector\<char\> 可以替代 string 嘛&#xff1f; …

指针-C语言(初阶)

目录 一、什么是指针 二、指针和指针类型 2.1 指针-整数 2.2 指针的解引用 三、野指针 3.1 野指针形成原因 3.2 如何规避野指针 四、指针运算 4.1 指针-整数 4.2 指针-指针 4.3 指针的关系运算 五、指针和数组 六、二级指针 七、指针数组 一、什么是指针 指针是内存中一个…

【八股】2023秋招八股复习笔记4(MySQL Redis等)

文章目录 目录1、MySQLmysql索引实现mysql索引优化mysql索引失效的情况mysql 千万数据优化mysql 事务隔离级别 & 实现原理mysql MVCC版本链&#xff08;undo log&#xff09;mysql数据同步机制 & 主从复制 &#xff08;binlog&#xff09;mysql 日志&数据恢复&…

5G NR:RACH流程-- Msg1之生成PRACH Preamble

随机接入流程中的Msg1&#xff0c;即在PRACH信道上发送random access preamble。涉及到两个问题&#xff1a; 一个是如何产生preamble&#xff1f;一个是如何选择正确的PRACH时频资源发送所选的preamble? 一、PRACH Preamble是什么 PRACH Preamble从数学上来讲是一个长度为…

MyBatis与Spring的集成整合加优化分页功能

目录 一.为什么要将MyBatis和Spring整合&#xff1f;&#xff1f;&#xff1f; 二.配置环境 2.1 pom文件 2.2 xml文件 三.演示举例 四.Aop整合pageHelper 分页插件 今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.为什么要将MyBatis和Spring整合&#xff1f…

自动驾驶感知传感器标定安装说明

1. 概述 本标定程序为整合现开发的高速车所有标定模块,可实现相机内参标定和激光、相机、前向毫米波 至车辆后轴中心标定,标定参数串联传递并提供可视化工具验证各个模块标定精度。整体标定流程如下,标定顺序为下图前标0-->1-->2-->3,相同编号标定顺序没有强制要求…