lambda表达式使用和示例
lambda表达式
什么是lambda
学习lamdba有两个结构十分关键,一个是lamdba自己,另一个是函数式接口
lamdba
- lamdba表达式本质上就是匿名方法,不能独立运行
- 用于实现函数式接口定义的另一个方法,因此lamdba会产生一个匿名类
- lamdba也常被称作闭包
- 引入了新的语法操作符 ->
函数式接口
- 只包含一个抽象方法的接口,这个方法说明了这个接口的意义和使用
- 函数式接口通常表示单个动作
- 有时被称作SAM类型,单抽象方法
lambda表达式示例
interface MyNumber{double getValue();
}
public static void main(String[] args){MyNumber myNum;myNum = ()-> 3.1415;System.out.println(myNum.getValue())
}//输出
3.1415
块lambda
- 处理简单的赋值等操作可以使用单个表达式
- 处理复杂的语句可以使用块lambda,可以使用多条语句
- 最后必须显示的使用return 返回值
块lambda 阶乘示例
interface MyNum{int func(int n);
}
public void test1(){MyNum mm = (n)->{int result =1;for(int i=1;i<=n;i++){result *= i;}return result;};System.out.println(mm.func(4));}
泛型函数式接口
示例
interface SomeFunc<T>{T func(T t);
}
public void test2(){SomeFunc<Integer> num = (n)-> n*10;SomeFunc<String> str = (s)-> "hello " + s;System.out.println(num.func(10));System.out.println(str.func("tom"));}
当作参数传递
interface SomeFunc<T>{T func(T t);
}
public String getResult(SomeFunc<String> some,String str){return some.func(str);}
public void test3(){String str = "hello java for lambda";String ret = getResult((n)->{return n.toUpperCase();},str);System.out.println(ret);String ret1 = getResult((n)->{return new StringBuffer(str).reverse().toString();},str);System.out.println(ret1);}
//输出
HELLO JAVA FOR LAMBDA
adbmal rof avaj olleh
lambda 表达式与异常
- lambda可以抛出异常
- 异常必须和函数式接口throws抛出的异常一致
代码示例
interface DoubleNumberFun{double fun(double[] n)throws DoubleNumberException;
}
class DoubleNumberException extends Exception{public DoubleNumberException(){super("array empty");}
}
public void test4() throws DoubleNumberException {DoubleNumberFun df = (n)->{if(n.length == 0)throw new DoubleNumberException();double sm = 0.0;for(int i=0;i<n.length;i++){sm += n[i];}return sm;};System.out.println(df.fun(new double[]{1.0,2.0,3.0}));System.out.println(df.fun(new double[]{}));}
//输出//6.0
//com.bai.lambda.DoubleNumberException: array empty
lambda 表达式变量捕获
- lambda 中可以显示或者隐式的使用this
- 使用局部变量默认是final 修饰,不能改变,不管有没有使用final。否则会提示Variable used in lambda expression should be final or effectively final
代码示例
interface MyNum{int func(int n);
}
int variable = 10;public void test5(){int variable1 = 0;MyNum m = (n)->{int sum = 0;for(int i=0;i<n;i++){sum += i + variable1;}//此处报错//Variable used in lambda expression should be final or effectively final//variable1 = sum;return sum;};MyNum m1 = (n)->{int sum = 0;for(int i=0;i<n;i++){//Variable used in lambda expression should be final or effectively finalsum += i + this.variable;}this.variable = sum;return sum;};}
方法引用
静态方法引用
- 形式: classname::methodName
- :: 是jdk8新添加分隔符,专门用于此处
- 函数式接口的方法要和静态方法兼容,比如下面的func 方法和strReverse兼容
代码示例
函数式接口
interface StringFunc{String func(String str);
}
静态方法
public static String StrReverse(String str){char[] chars = new char[str.length()];for(int i=0;i<str.length();i++){chars[i] = str.charAt(str.length()-1-i);}return new String(chars);}
方法引用
public static String stringOpts(StringFunc func,String str){return func.func(str);}
测试方法
public static void main(String[] args) {String result = stringOpts(MyStringOpts::StrReverse,"helllo lambda static");System.out.println(result);}
//输出
//citats adbmal ollleh
实例中使用
对象调用
objRef::methodname
需要先 new 对象在进行调用
interface StringFunc{String func(String str);
}
class ObjRef{public String reverse(String str){StringBuffer buf = new StringBuffer();for(int i=0;i<str.length();i++){buf.append(str.charAt(str.length()-1-i));}return buf.toString();}}
class MainTest1{public static String stringOpts(StringFunc func,String str){return func.func(str);}public static void main(String[] args) {ObjRef objRef = new ObjRef();String result = stringOpts(objRef::reverse,"你好 lambda");System.out.println(result);}
}
//输出
//adbmal 好你
实例方法
className::methodName
- 第一个参数匹配调用对象
- 第二个参数匹配调用方法的参数
具体请看代码示例:
函数式接口
注意这个函数有两个参数
interface MyFunc<T>{boolean func(T t1,T t2);
}
实体对象
主要使用下面的equals,lessThan方法,两个方法中的参数对应函数式接口中的第二个参数
class Student{private Integer glades;public Student(Integer glades){this.glades = glades;}public boolean equals(Student student){return glades == student.glades;}public boolean lessThan(Student student){return glades < student.glades;}}
方法引用
public static <T> int count(T[] val,MyFunc<T> f,T v){int count = 0;for(int i=0;i<val.length;i++){if(f.func(val[i],v))count++;}return count;}
测试
Student[] arrs = new Student[]{new Student(50),new Student(60),new Student(60),new Student(80),new Student(90)};int ret = count(arrs,Student::equals,new Student(60));System.out.println(ret);
//2int ret1 = count(arrs,Student::lessThan,new Student(60));System.out.println(ret1);
//2
泛型中引用
接口
interface MyFunc<T>{int func(T[] vals,T t);
}
泛型方法,非泛型类
public class FanxingLambda {static <T> int countMath(T[] vals,T t){int count = 0;for(int i=0;i<vals.length;i++){if(vals[i] == t)count++;}return count;}
}
引用方法
public static <T> int countFun(MyFunc<T> f,T[] vals,T t){return f.func(vals,t);}
测试方法
public static void main(String[] args) {Integer[] arrs = new Integer[]{1,2,3,4,5,2,4,5,2,1,2,3};int count = countFun(FanxingLambda::<Integer>countMath,arrs,2);System.out.println(count);}
注意
int count = countFun(FanxingLambda::<Integer>countMath,arrs,2);
FanxingLambda::countMath
因为FanxingLambda不是泛型类,但是countMath是泛型方法,所以可以在::前面指定Integer类型
也可以不写,因为类型参数会推断出类型
找出最大值示例
需要使用Collections.max方法,其中第二个参数传入一个比较器Comparator
源码
Collections : public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
Comparator: int compare(T o1, T o2);
测试代码
实体
class Salary{private double val;public Salary(double val){this.val = val;}public double getVal(){return val;}public static int comparaSalary(Salary s1,Salary s2){return (int)(s1.val - s2.val);}
}
测试方法
public static void main(String[] args) {List<Salary> list = new ArrayList<>();list.add(new Salary(100.1));list.add(new Salary(2000.3));list.add(new Salary(1000));list.add(new Salary(3000.5));list.add(new Salary(235));Salary s = Collections.max(list,Salary::comparaSalary);System.out.println(s.getVal());}//3000.5
构造函数引用
classname::new
interface ClassFun<T,V>{T func(V v);
}
class Emp{private Integer age;public Emp(Integer age){this.age = age;}public Integer getAge(){return age;}
}
class People<T>{private T t;public People(T t){this.t = t;}public T getVal(){return t;}
}
ClassFun<Emp,Integer> c = Emp::new;Emp e = c.func(100);System.out.println(e.getAge());ClassFun<People<String>,String> c1 = People::new;People<String> p = c1.func("zhangsan");System.out.println(p.getVal());//100//zhangsan
相关文章:
lambda表达式使用和示例
lambda表达式 什么是lambda 学习lamdba有两个结构十分关键,一个是lamdba自己,另一个是函数式接口 lamdba lamdba表达式本质上就是匿名方法,不能独立运行用于实现函数式接口定义的另一个方法,因此lamdba会产生一个匿名类lamdba…...
STM32学习笔记十八:WS2812制作像素游戏屏-飞行射击游戏(8)探索游戏多样性,范围伤害模式
前面我们的攻击手段比较单一,虽然已经分出了 EnemyT1 / EnemyT2 / EnemyT3, 但里面还是基本一样的。这回,我们尝试实现一些新的攻击方法,实现一些新的算法。 1、前面我们小飞机EnemyT1 的攻击方式是垂直向下发射子弹。 那么大飞机…...
C#获取windows系统资源使用情况
1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源(内存、负载、磁盘容量)》,这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…...
PE解释器之PE文件结构
PE文件是由许许多多的结构体组成的,程序在运行时就会通过这些结构快速定位到PE文件的各种资源,其结构大致如图所示,从上到下依次是Dos头、Nt头、节表、节区和调试信息(可选)。其中Dos头、Nt头和节表在本文中统称为PE文件头(因为SizeOfHeaders…...
Android—— MIPI屏调试
一、实现步骤 1、在kernel/arch/arm/boot/dts/lcd-box.dtsi文件中打开&dsi0节点,关闭其他显示面板接口(&edp_panel、&lvds_panel) --- a/kernel/arch/arm/boot/dts/lcd-box.dtsib/kernel/arch/arm/boot/dts/lcd-box.dtsi-5,14 …...
BLE协议—协议栈基础
BLE协议—协议栈基础 BLE协议栈基础通用访问配置文件层(Generic Access Profile,GAP)GAP角色设备配置模式和规程安全模式广播和扫描 BLE协议栈基础 蓝牙BLE协议栈包含三部分:主机、主机接口层和控制器。 主机:逻辑链路…...
yolov8知识蒸馏代码详解:支持logit和feature-based蒸馏
文章目录 1. 知识蒸馏理论2. yolov8 蒸馏代码应用2.1 环境配置2.2 训练模型(1) 训练教师模型(2) 训练学生模型baseline(3) 蒸馏训练3. 知识蒸馏代码详解3.1 蒸馏参数设置3.2 蒸馏损失代码讲解3.2.1 Feature based loss3.2.1 Logit loss3.3 获取蒸馏的feature map及channels...
03-微服务-Ribbon负载均衡
Ribbon负载均衡 1.1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢? 1.2.源码跟踪 为什么我们只输入…...
2023新年总结与展望
2023年总结 对Spring Cloud微服务更加熟悉,对consul、kafka、gateway的熟悉和掌握更近一步对docker和虚拟化部署更加熟悉对PostgreSQL数据库和JPA更加熟悉对clickhouse数据库和大数据分析更加熟悉对netty和socket网络通信更加熟悉 2024年flag 继续深入研究和学习…...
论文阅读——SG-Former
SG-Former: Self-guided Transformer with Evolving Token Reallocation 1. Introduction 方法的核心是利用显著性图,根据每个区域的显著性重新分配tokens。显著性图是通过混合规模的自我关注来估计的,并在训练过程中自我进化。直观地说,我们…...
常用环境部署(十三)——GitLab整体备份及迁移
一、GitLab备份 注意:由于我的GitLab是docker安装的,所以我的操作都是在容器内操作的,大家如果不是用docker安装的则直接执行命令就行。 1、Docker安装GitLab 链接:常用环境部署(八)——Docker安装GitLab-CSDN博客 2、GitLab备…...
海外数据中心代理与住宅代理:优缺点全面对比
数据中心代理和住宅代理是为了匿名而开发的,通过替换网站眼中您自己的 IP 地址。然而,它们在价格、功能、性能或最佳用例方面存在一些差异。那么,这些代理类型到底有什么相似点和不同点呢? 一、什么是数据中心代理? 1…...
springboot实现OCR
1、引入依赖 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version> </dependency> 2、config Configuration public class TessOcrConfiguration {Beanpublic …...
【Scala 】注解
在 Scala 中,你可以使用注解来为类、方法或字段添加元数据,影响它们的行为。Scala 的注解使用与 Java 类似,但是 Scala 也支持自定义注解。 文章目录 注解的常见使用方法自定义注解 注解的常见使用方法 以下是一些 Scala 中常见的注解以及它…...
数通基础知识总结
1. 基础概念 1.1. 通信基本原理 通信基本原理涉及信息的生成、编码、传输和解码的过程。在实际应用中,例如电话通信,信息通过话筒转换成模拟信号,经过传输线路传递到接收端,再由耳机解码还原为可理解的信息。 1.2. 信道和信号 …...
机器学习深度学习面试笔记
机器学习&深度学习面试笔记 机器学习Q. 在线性回归中,如果自变量之间存在多重共线性,会导致什么问题?如何检测和处理多重共线性?Q. 什么是岭回归(Ridge Regression)和Lasso回归(Lasso Regression)?它们与普通线性回…...
安卓和Android是两种不同的操作系统?
实际上,安卓和Android并不是同一种操作系统! Android是由Google开发并维护更新的一款操作系统,目前仅能运行在Pixel手机上。 Google Pixel 与 iPhone手机:哪个更好?Google Pixel 与 Apple iPhone哪个手机才是性价比最…...
Java学习——设计模式——结构型模式2
文章目录 结构型模式装饰者模式桥接模式外观模式组合模式享元模式 结构型模式 结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过…...
什么是Maven ??? (以及关于依赖,中央仓库,国内源)
文章目录 什么是 Maven创建第一个 Maven 项目依赖管理Maven 的仓库Maven 如何设置国内源 什么是 Maven Maven :用于构建和管理任何基于java的项目的工具。**说白了就是管理 Java项目 的工具。**我们希望我们已经创建了一些东西,可以使Java开发人员的日常…...
c++期末考题笔试来咯
最后一道大题题目再现 写一个person类,有姓名,性别,年龄。然后在此基础上派生出教师类和学生类。教师类增加了以下数据:工号,职称,工资。学生类增加了以下数据成员:学号,专业&#…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
