lambda表达式

一,什么是lambda表达式

1.1 函数式接口

要想了解什么是lambda表达式,就必须得知道什么是函数式接口,函数式接口是指只包含一个抽象方法的接口。如果我们自己写一个函数时接口,最好在接口前添加@Functionallnterface,@Override具有类似的作用,可以检查我们所写的接口是否正确。例如:

@FunctionalInterface
interface One{

        // 可以有其他的字段和方法,但是只能有一个抽象方法
        void test();
}

1.2 lambda表达式的语法

(parameters) -> expression 或 (parameters) -> { statements;}

parameter : 方法中的参数列表,这里的方法指的是函数式接口中的抽象方法,注意这里的参数可以不写类型(要么全都写参数类型,要么全都不写参数类型)。

expression(表达式)/statements(代码块) : 是函数式接口中抽象方法的具体实现。

注意:

  1. 参数类型可以省略。
  2. 如果参数列表中只有一个参数,() 可以省略。
  3. 如果方法体中只有一条语句,那么{}可以省略。
  4. 如果方法体中只有一条语句,且该语句是return语句,要么添加{},要么省略return。
  5. 如果参数列表中没有参数,()不可以省略。

二,lambda表达式的使用

可以说,lambda表达式是匿名内部类的一种简写形式,但是还是有一定的区别,lambda表达式所需要的函数式接口只能有一个抽象方法,匿名内部类所需要的接口可以有多个抽象方法。

2.1 无返回值无参

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {void test();
}
public class Demo {public static void main(String[] args) {NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {@Overridepublic void test() {System.out.println("无参数");}};//这两个语句的内容一样,上面是用匿名表达式,下面是用lambda表达式NoParameterNoReturn noParameterNoReturn1 = () -> System.out.println("无参数");}
}

2.2 无返回值一个参

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {void test(int a);
}
public class Demo {public static void main(String[] args) {OneParameterNoReturn oneParameterNoReturn = (a) -> System.out.println("a");//或    = a -> System.out.println("a");}
}

2.3 无返回值多个参

//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {void test(int a,int b);
}
public class Demo {public static void main(String[] args) {MoreParameterNoReturn moreParameterNoReturn= (a,b) -> System.out.println(a+b);//或    = (int a, int b) -> System.out.println(a+b);}
}

2.4 有返回值无参数

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {String test();
}
public class Demo {public static void main(String[] args) {NoParameterReturn noParameterReturn= () -> "hello";//注:无参时,()不能省略}
}

2.5 有返回值一个参数

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {int test(int a);
}
public class Demo {public static void main(String[] args) {OneParameterReturn oneParameterReturn= (a) -> {return a;};//或    = a -> a;}
}

2.6 有返回值多个参数

//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {int test(int a,int b);
}public class Demo {public static void main(String[] args) {MoreParameterReturn moreParameterReturn= (a,b) -> a + b;//或    = (a,b) -> {return a+b;};}
}

三,变量捕获

匿名内部类和lambda表达式中的变量捕获只适用于局部变量!!!

3.1 匿名内部类

当在匿名内部类中引用外部类的局部变量时,这个局部变量必须声明为final或者实际上为final(即只赋值一次)。这是因为匿名内部类的实例可能会在外部方法执行完毕之后才被创建和使用,如果内部类可以修改外部局部变量,就可能导致不可预期的结果。

interface Str{void print();
}
public class Demo2 {public static void main(String[] args) {int a = 10;Str str = new Str() {@Overridepublic void print() {//a = 20;这样写会报错System.out.println(a);}};str.print();}
}

3.2 lambda表达式

在Lambda表达式中,可以访问的外部变量必须是隐式final或者实际上为final(即只在赋值一次)。

interface A{void eat();
}
public class Demo3 {public static void main(String[] args) {int b = 10;A a = () -> {b = 3;System.out.println(b);};a.eat();}
}

注意:

  1. 尽管我们可以在Lambda表达式中访问外部变量y,但不允许在Lambda表达式中重新声明具有相同名称的变量。
  2. 捕获的变量在Lambda表达式中是被复制的而不是被引用,这意味着如果外部变量在Lambda表达式外部发生了变化,那么Lambda表达式内部捕获的变量值不会受到影响。

四,Lambda在集合当中的使用

对应的接口新增的方法
CollectionremoveIf()  spliterator()  stream()  paralleStream()  forEach()
ListreplaceAll()  sort()
MapgetOrDeflaut()  forEach()  replaceAll()  putIfAbsent()  remove()  raplace()  ......

4.1  forEach()

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;public class Demo1 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add(i);}list.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.print(integer +" ");}});System.out.println();list.forEach((x)-> System.out.print(x + " "));}
}

4.2 sort() 

import java.util.ArrayList;
import java.util.List;public class Demo1 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add(10-i);}list.forEach((x)-> System.out.print(x + " "));System.out.println();list.sort((o1, o2) -> o1 - o2);list.forEach((x)-> System.out.print(x + " "));}
}

 lambda表达式使代码更加简洁,但同时使代码的可读性变差,且不易调试

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

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

相关文章

程序员如何利用公网远程访问查询本地硬盘【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…

去掉鼠标系列之一: 语雀快捷键使用指南

其实应该是系列之二了&#xff0c;因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了&#xff0c;主要是觉得一会儿用鼠标&#xff0c;一会儿键盘&#xff0c;一点儿不酷&#xff0c;我希望可以一直用键盘&#xff0c;抛开鼠标。后面陆续记录一下各个软件的快捷…

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…

【数据结构】栈和队列

大家好&#xff01;今天我们来学习数据结构中的栈和队列。 目录 1. 栈 1.1 栈的概念及结构 1.2 栈的定义 1.3 栈的接口实现 1.3.1 初始化栈 1.3.2 入栈 1.3.3 出栈 1.3.4 获取栈顶元素 1.3.5 获取栈中有效元素个数 1.3.6 检测栈是否为空 1.3.7 销毁栈 1.4 栈的完整…

堆 和 优先级队列(超详细讲解,就怕你学不会)

优先级队列 一、堆的概念特性二、堆的创建1、向下调整算法2、向下调整建堆3、向下调整建堆的时间复杂度 三、堆的插入1、向上调整算法实现插入2、插入创建堆的时间复杂度 三、堆的删除四、Java集合中的优先级队列1、PriorityQueue 接口概述及模拟实现2、如何创建大根堆&#xf…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,containsKey)五(117)

需求&#xff1a;前端根据后端的返回数据&#xff1a;画统计图&#xff1b; 1.动态获取地域数据以及数据中的平均值&#xff0c;按照平均值降序排序&#xff1b; 说明&#xff1a; X轴是动态的&#xff0c;有对应区域数据则展示&#xff1b; X轴 区域数据降序排序&#xff1b;…

Intelij IDEA 配置Tomcat解决Application Server不显示的问题

今天搭建war工程时部署项目发现&#xff0c;IDEA的控制台没有Application Servers&#xff0c;在网上查了一下&#xff0c;总结几个比较好的解决方法&#xff0c;为了方便自己和其他人以后碰到相同的问题&#xff0c;不再浪费时间再次寻找解决办法。 Intelij IDEA 配置Tomcat时…

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

目录 前言阅读准备阅读指引阅读建议 课程内容一、依赖注入方式&#xff08;前置知识&#xff09;1.1 手动注入1.2 自动注入1.2.1 XML的autowire自动注入1.2.1.1 byType&#xff1a;按照类型进行注入1.2.1.2 byName&#xff1a;按照名称进行注入1.2.1.3 constructor&#xff1a;…

uniapp小程序实现上传图片功能,并显示上传进度

效果图&#xff1a; 实现方法&#xff1a; 一、通过uni.chooseMedia(OBJECT)方法&#xff0c;拍摄或从手机相册中选择图片或视频。 官方文档链接: https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia uni.chooseMedia({count: 9,mediaType: [image,video],so…

【Django】无法从“django.utils.encoding”导入名称“force_text”

整晚处理 Django 的导入错误。 我将把它作为提醒&#xff0c;希望处于相同情况的人数会减少。 原因 某些软件包版本不支持Django 4 请看下表并决定Django和Python的版本 方案 如果出现难以响应&#xff0c;或者更改环境麻烦&#xff0c;请尝试以下操作 例如出现以下错误 …

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

(六)、深度学习框架中的算子

1、深度学习框架算子的基本概念 深度学习框架中的算子&#xff08;operator&#xff09;是指用于执行各种数学运算和操作的函数或类。这些算子通常被用来构建神经网络的各个层和组件&#xff0c;实现数据的传递、转换和计算。 算子是深度学习模型的基本组成单元&#xff0c;它们…

程序的DAC检查与LSM简介

程序的DAC检查 在Linux中&#xff0c;程序的DAC&#xff08;Discretionary Access Control&#xff0c;自主访问控制&#xff09;检查是指操作系统对程序执行期间对文件和资源的访问权限进行的检查。 Linux使用一种基于权限的访问控制模型&#xff0c;其中每个文件和资源都与…

Spark 图计算ONEID 进阶版

0、环境信息 本文采用阿里云maxcompute的spark环境为基础进行的&#xff0c;搭建本地spark环境参考搭建Windows开发环境_云原生大数据计算服务 MaxCompute-阿里云帮助中心 版本spark 2.4.5&#xff0c;maven版本大于3.8.4 ①配置pom依赖 详见2-1 ②添加运行jar包 ③添加配置信…

【Linux】IO多路转接——poll接口

目录 poll初识 poll函数 poll服务器 poll的优点 poll的缺点 poll初识 poll也是系统提供的一个多路转接接口。 poll系统调用也可以让我们的程序同时监视多个文件描述符上的事件是否就绪&#xff0c;和select的定位是一样的&#xff0c;适用场景也是一样的。 poll函数 po…

LC-将有序数组转换为二叉搜索树

LC-将有序数组转换为二叉搜索树 链接&#xff1a;https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索…

QT的mysql(数据库)最佳实践和常见问题解答

涉及到数据库&#xff0c;首先安利一个软件Navicat Premium&#xff0c;用来查询数据库很方便 QMysql驱动是Qt SQL模块使用的插件&#xff0c;用于与MySQL数据库进行通信。要编译QMysql驱动&#xff0c;您需要满足以下条件&#xff1a; 您需要安装MySQL的客户端库和开发头文件…

【LeetCode】字符串匹配

字符串匹配问题 常见的字符串匹配算法包括暴力匹配、 Knuth-Morris-Pratt 算法、Boyer-Moore算法、Sunday 算法等 解题 思路 1: 两个指针各指向两个字符串的起始位置,先判断,两个字符串的第一个字符是否相同,如果相同的话,则将两个指针往下移动,并且判断较短字符串的下一个字符…

el-table实现静态和动态合并单元格 以及内容显示的问题

实现效果图 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序号" width"50"><el-tab…

[MySQL] — 数据类型和表的约束

目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar char和varchar的区别 日期和时间类型 enum 和 set 表的约束 空属性 默认值 列描述 zeorfill 主键 创建表时在字段上指定主键 删除主键&#xff1a; 追…