lambda表达式使用和示例

lambda表达式

什么是lambda

学习lamdba有两个结构十分关键,一个是lamdba自己,另一个是函数式接口

lamdba

  1. lamdba表达式本质上就是匿名方法,不能独立运行
  2. 用于实现函数式接口定义的另一个方法,因此lamdba会产生一个匿名类
  3. lamdba也常被称作闭包
  4. 引入了新的语法操作符 ->

函数式接口

  1. 只包含一个抽象方法的接口,这个方法说明了这个接口的意义和使用
  2. 函数式接口通常表示单个动作
  3. 有时被称作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

  1. 处理简单的赋值等操作可以使用单个表达式
  2. 处理复杂的语句可以使用块lambda,可以使用多条语句
  3. 最后必须显示的使用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 表达式与异常

  1. lambda可以抛出异常
  2. 异常必须和函数式接口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 表达式变量捕获

  1. lambda 中可以显示或者隐式的使用this
  2. 使用局部变量默认是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;};}

方法引用

静态方法引用

  1. 形式: classname::methodName
  2. :: 是jdk8新添加分隔符,专门用于此处
  3. 函数式接口的方法要和静态方法兼容,比如下面的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

  1. 第一个参数匹配调用对象
  2. 第二个参数匹配调用方法的参数

具体请看代码示例:

函数式接口

注意这个函数有两个参数

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

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

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

相关文章

全球海洋数据 (GLODAP) v2.2023(海洋碳数据产品)

全球海洋数据分析项目 (GLODAP) v2.2023 全球海洋数据分析项目 (GLODAP) v2.2023 代表了海洋生物地球化学瓶数据合成方面的重大进步。此更新主要关注海水无机碳化学&#xff0c;以 GLODAPv2.2022 为基础&#xff0c;包含多项关键增强功能。值得注意的是&#xff0c;增加了 43 …

CISSP 第9章:安全脆弱性、威胁和对策

第九章 安全脆弱性、威胁和对策 9.1 评估和缓解安全脆弱性 9.1 硬件 处理器 执行类型 多任务处理&#xff1a; 同时处理两个或更多任务 多处理&#xff1a; 利用多个处理器完成一个应用程序的处理能力 多程序设计&#xff1a;通过操作系统对单个处理器上的两个任务进行协调&…

Node.js+Express+Mysql实现分页查询

根据记录数总数和分页数获到页总数 function pageCount (totalnum,limit){return totalnum > 0 ? ((totalnum < limit) ? 1 : ((totalnum % limit) ? (parseInt(totalnum / limit) 1) : (totalnum / limit))) : 0; } 接收请求代码 router.get(/api/user/page, asy…

自动驾驶货车编队行驶系统功能规范

货车编队行驶功能规范 Truck Platooning Functional Specification 目录 1 概述... 7 1.1 目的... 7 1.2 范围... 7 1.3 术语及缩写... 7 1.4 参考法规标准... 8 2 功能规范... 9 2.1 功能描述... 9 2.1.1 功能用途…

简述DIV元素和SPAN元素的区别

DIV和SPAN是两种常见的HTML元素&#xff0c;DIV是块元素&#xff0c;默认换行&#xff0c;一般用于排版。SPAN是行内元素&#xff0c;默认不换行&#xff0c;一般用于局部文字样式。通过DISPLAY他们之间可以相互转换&#xff0c;DIV默认是BLOCK&#xff0c;SPAN默认是INLINE. 它…

代码随想录day9-KMP算法

title: 代码随想录Day9 date: 2024-01-04 19:38:32 代码随想录笔记 categories:技术 代码随想录day9-KMP算法|28. 找出字符串中第一个匹配项的下标 宏观 本来使用暴力 O(m*n)的算法&#xff0c;通过KMP方法&#xff0c;基于前缀表构建失败函数next数组&#xff0c;在失败后进…

centos6后台启动docker

如果您正在使用 Docker 1.7 并且希望使用 sudo docker -d --storage-drivervfs & 命令在 CentOS 6 上后台运行 Docker&#xff0c;但发现它没有按预期工作&#xff0c;这里有一些建议可以尝试&#xff1a; 确保使用正确的语法&#xff1a;在 Docker 1.7 中&#xff0c;-d 或…

计算机系统的性能指标

1.字长和数据通路宽度 字长&#xff1a;字长指的是计算机中一个数据字的长度。一个数据字是计算机中进行运算和存储的最小单位&#xff0c;通常由多个二进制位&#xff08;比如8位、16位、32位等&#xff09;组成。 举个例子&#xff0c;假设一个计算机的字长为8位&#xff0…

SSCI及SCI撰写|查找文献doi的八大方法

一、前言 (一)文献DOI概念介绍 DOI&#xff08;Digital Object Identifier&#xff09;是一种用于标识数字对象的持久性标识符系统。在学术出版领域&#xff0c;DOI通常用于标识和定位学术文献&#xff0c;包括期刊文章、会议论文、报告等。以下是 DOI 的一些重要特点和介绍&a…

【网络】网络层IP地址和IP数据报的格式

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

【Python小游戏】贪吃蛇丨名侦探柯南(完整代码)

文章目录 写在前面PyGame入门贪吃蛇注意事项写在后面写在前面 本期内容:基于pygame的贪吃蛇小游戏 实验环境 python3.11及以上pycharmpygame安装pygame的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygamePyGame入门 pygame是一个开源的Python模块,…

【动态规划】413. 等差数列划分

413. 等差数列划分 解题思路 定义一个数组 dp&#xff0c;其中 dp[i] 表示以 nums[i] 结尾的等差子数组的个数。 使用一个循环遍历数组 nums&#xff0c;从索引 1 开始&#xff0c;直到 nums.length - 2 结束。这是因为要保证以 nums[i] 结尾的子数组至少包含三个元素&#x…

如何全面、准确地采集各种能耗数据?如何实时监控工厂的能源使用情况?

工厂能源数据采集与实时监控是工厂能耗管理系统&#xff08;EMS&#xff09;的重要组成部分&#xff0c;对于提高能源效率、降低运营成本以及优化生产流程至关重要。通过采用多种方法和工具&#xff0c;全面、准确地采集各种能耗数据&#xff0c;并实时监控工厂的能源使用情况&…

iOS手机查看蓝牙底层日志

文章目录 一、需要的环境二、在iOS设备上安装Profiles文件三、安装Xcode四、安装packetLogger五、启动蓝牙数据包分析 参考文档&#xff1a;A New Way to Debug iOS Bluetooth Applications 一、需要的环境 iOS 13 device and cableMac computer/laptopApple Developer Progr…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解——网络数据包分析

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…

顶顶通呼叫中心中间件配置指定振铃时间挂断(mod_cti基于FreeSWITCH)

介绍 一般情况默认是振铃60秒挂断&#xff0c;但是如果想振铃10秒就挂断可以根据下方配置方法一步步去配置。 一、通过线路控制振铃时间 打开ccadmin-》点击线路-》点击你需要控制振铃时间的线路-》配置呼叫超时-》点击更新。 二、通过队列外呼控制振铃时间 打开ccadmin-》…

2023年山东省职业院校技能大赛高职组信息安全管理与评估-镜像文件取证解析

任务3:镜像文件取证(100分) 目录 任务3:镜像文件取证(100分) 解题方法: Evidence1 Evidence2 Eviden

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑分布式资源交易的气电综合能源配网系统出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的免费专栏栏目《论文与完整程序》 这个标题涉及到气电综合能源配网系统的出清模型&#xff0c;特别强调了对分布式资源交易的考虑。以下是对标题中关键术语的解读&#xff1a; 气电综合能…

paddlehub 文本检测使用

PaddleHub负责模型的管理、获取和预训练模型的使用。 参考&#xff1a;https://github.com/PaddlePaddle/PaddleHub/tree/develop/modules/image/text_recognition/chinese_text_detection_db_server import paddlehub as hub import cv2 # from utils import cv_show import…

《网络是怎样连接的》2.1节图表(自用)

图3.1&#xff1a;协议栈的组成 图3.2&#xff1a;netstat命令查看套接字 上图中每一行就是一个套接字 图3.3&#xff1a;协议栈在浏览器访问DNS服务器与web服务器时的具体工作流程 套接字由协议栈创建 应用程序通过Socket库中的程序组件与协议栈交互 图3.4&#xff1a;TCP头…