当前位置: 首页 > news >正文

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

相关文章:

lambda表达式使用和示例

lambda表达式 什么是lambda 学习lamdba有两个结构十分关键&#xff0c;一个是lamdba自己&#xff0c;另一个是函数式接口 lamdba lamdba表达式本质上就是匿名方法&#xff0c;不能独立运行用于实现函数式接口定义的另一个方法&#xff0c;因此lamdba会产生一个匿名类lamdba…...

STM32学习笔记十八:WS2812制作像素游戏屏-飞行射击游戏(8)探索游戏多样性,范围伤害模式

前面我们的攻击手段比较单一&#xff0c;虽然已经分出了 EnemyT1 / EnemyT2 / EnemyT3&#xff0c; 但里面还是基本一样的。这回&#xff0c;我们尝试实现一些新的攻击方法&#xff0c;实现一些新的算法。 1、前面我们小飞机EnemyT1 的攻击方式是垂直向下发射子弹。 那么大飞机…...

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源&#xff08;内存、负载、磁盘容量&#xff09;》&#xff0c;这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…...

PE解释器之PE文件结构

PE文件是由许许多多的结构体组成的&#xff0c;程序在运行时就会通过这些结构快速定位到PE文件的各种资源&#xff0c;其结构大致如图所示&#xff0c;从上到下依次是Dos头、Nt头、节表、节区和调试信息(可选)。其中Dos头、Nt头和节表在本文中统称为PE文件头(因为SizeOfHeaders…...

Android—— MIPI屏调试

一、实现步骤 1、在kernel/arch/arm/boot/dts/lcd-box.dtsi文件中打开&dsi0节点&#xff0c;关闭其他显示面板接口&#xff08;&edp_panel、&lvds_panel&#xff09; --- a/kernel/arch/arm/boot/dts/lcd-box.dtsib/kernel/arch/arm/boot/dts/lcd-box.dtsi-5,14 …...

BLE协议—协议栈基础

BLE协议—协议栈基础 BLE协议栈基础通用访问配置文件层&#xff08;Generic Access Profile&#xff0c;GAP&#xff09;GAP角色设备配置模式和规程安全模式广播和扫描 BLE协议栈基础 蓝牙BLE协议栈包含三部分&#xff1a;主机、主机接口层和控制器。 主机&#xff1a;逻辑链路…...

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的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1&#xff0c;怎么变成了http://localhost:8081的呢&#xff1f; 1.2.源码跟踪 为什么我们只输入…...

2023新年总结与展望

2023年总结 对Spring Cloud微服务更加熟悉&#xff0c;对consul、kafka、gateway的熟悉和掌握更近一步对docker和虚拟化部署更加熟悉对PostgreSQL数据库和JPA更加熟悉对clickhouse数据库和大数据分析更加熟悉对netty和socket网络通信更加熟悉 2024年flag 继续深入研究和学习…...

论文阅读——SG-Former

SG-Former: Self-guided Transformer with Evolving Token Reallocation 1. Introduction 方法的核心是利用显著性图&#xff0c;根据每个区域的显著性重新分配tokens。显著性图是通过混合规模的自我关注来估计的&#xff0c;并在训练过程中自我进化。直观地说&#xff0c;我们…...

常用环境部署(十三)——GitLab整体备份及迁移

一、GitLab备份 注意&#xff1a;由于我的GitLab是docker安装的&#xff0c;所以我的操作都是在容器内操作的&#xff0c;大家如果不是用docker安装的则直接执行命令就行。 1、Docker安装GitLab 链接&#xff1a;常用环境部署(八)——Docker安装GitLab-CSDN博客 2、GitLab备…...

海外数据中心代理与住宅代理:优缺点全面对比

数据中心代理和住宅代理是为了匿名而开发的&#xff0c;通过替换网站眼中您自己的 IP 地址。然而&#xff0c;它们在价格、功能、性能或最佳用例方面存在一些差异。那么&#xff0c;这些代理类型到底有什么相似点和不同点呢&#xff1f; 一、什么是数据中心代理&#xff1f; 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 中&#xff0c;你可以使用注解来为类、方法或字段添加元数据&#xff0c;影响它们的行为。Scala 的注解使用与 Java 类似&#xff0c;但是 Scala 也支持自定义注解。 文章目录 注解的常见使用方法自定义注解 注解的常见使用方法 以下是一些 Scala 中常见的注解以及它…...

数通基础知识总结

1. 基础概念 1.1. 通信基本原理 通信基本原理涉及信息的生成、编码、传输和解码的过程。在实际应用中&#xff0c;例如电话通信&#xff0c;信息通过话筒转换成模拟信号&#xff0c;经过传输线路传递到接收端&#xff0c;再由耳机解码还原为可理解的信息。 1.2. 信道和信号 …...

机器学习深度学习面试笔记

机器学习&深度学习面试笔记 机器学习Q. 在线性回归中&#xff0c;如果自变量之间存在多重共线性&#xff0c;会导致什么问题&#xff1f;如何检测和处理多重共线性&#xff1f;Q. 什么是岭回归(Ridge Regression)和Lasso回归(Lasso Regression)&#xff1f;它们与普通线性回…...

安卓和Android是两种不同的操作系统?

实际上&#xff0c;安卓和Android并不是同一种操作系统&#xff01; Android是由Google开发并维护更新的一款操作系统&#xff0c;目前仅能运行在Pixel手机上。 Google Pixel 与 iPhone手机&#xff1a;哪个更好&#xff1f;Google Pixel 与 Apple iPhone哪个手机才是性价比最…...

Java学习——设计模式——结构型模式2

文章目录 结构型模式装饰者模式桥接模式外观模式组合模式享元模式 结构型模式 结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能&#xff0c;但结构型模式不仅仅简单地使用继承&#xff0c;而更多地通过…...

什么是Maven ??? (以及关于依赖,中央仓库,国内源)

文章目录 什么是 Maven创建第一个 Maven 项目依赖管理Maven 的仓库Maven 如何设置国内源 什么是 Maven Maven &#xff1a;用于构建和管理任何基于java的项目的工具。**说白了就是管理 Java项目 的工具。**我们希望我们已经创建了一些东西&#xff0c;可以使Java开发人员的日常…...

c++期末考题笔试来咯

最后一道大题题目再现 写一个person类&#xff0c;有姓名&#xff0c;性别&#xff0c;年龄。然后在此基础上派生出教师类和学生类。教师类增加了以下数据&#xff1a;工号&#xff0c;职称&#xff0c;工资。学生类增加了以下数据成员&#xff1a;学号&#xff0c;专业&#…...

目标检测篇:如何根据xml标注文件生成类别classes的json文件

1. 介绍 之前在做目标检测任务的时候&#xff0c;发现很多的数据集仅有数据(只有图片标注的xml文件)&#xff0c;没有关于类别的json文件&#xff0c;为了以后方便使用&#xff0c;这里记录一下 一般来说&#xff0c;yolo标注的数据集&#xff0c;只有第一个是数字类别&#x…...

spring见解2基于注解的IOC配置

3.基于注解的IOC配置 学习基于注解的IOC配置&#xff0c;大家脑海里首先得有一个认知&#xff0c;即注解配置和xml配置要实现的功能都是一样的&#xff0c;都是要降低程序间的耦合。只是配置的形式不一样。 3.1.创建工程 3.1.1.pom.xml <?xml version"1.0" en…...

Uncaught TypeError: Cannot read property ‘snj‘ of null

项目场景&#xff1a; 项目相关背景&#xff1a; 调试项目时&#xff0c;控制台出现红色报错信息 问题描述 问题&#xff1a; 调试项目时&#xff0c;控制台出现如下所示的报错信息&#xff1a; Uncaught TypeError: Cannot read property snj of nullat T.Inj.Ya [as Inj…...

Jenkins基础教程

目录 第一章、快速了解Jenkins1.1&#xff09;Jenkins中一些概念介绍1.2&#xff09;Jenkins和maven用途上的区别1.3&#xff09;为什么使用Jenkins1.4&#xff09;学习过程中的疑问 第二章、安装Jenkins2.1&#xff09;安装之前的准备2.2&#xff09;Windows中Jenkins下载安装…...

嵌入式C语言--WatchDog最全概念

嵌入式C语言–WatchDog最全概念 嵌入式C语言--WatchDog最全概念 嵌入式C语言--WatchDog最全概念一. 什么是Watchdog1&#xff09;什么是“被狗咬”2&#xff09;什么是喂狗 二. 基本思想三. 作用四. 监视目标1) 监视一个进程2&#xff09;监视一个操作系统 五. 系统初始化时关闭…...

数据结构【树篇】(二)

数据结构【树篇】(二&#xff09; 文章目录 数据结构【树篇】(二&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录树(一)、树的存储(二)、树和森林的遍历——并查集(三)、并查集的优化 结语 前言 为什么突然想学算法了&#xf…...

2024上海城博会|上海国际城市与建筑博览会-官 网

2024上海城博会|上海国际城市与建筑博览会 时间&#xff1a;2024年10月30日-11月1日 地点&#xff1a;上海世博展览馆 主办单位&#xff1a;联合国人居署 上海市住房和城乡建设管理委员会 协办单位&#xff1a;上海世界城市日事务协调中心 展会介绍 上海国际城市与建筑博览…...

Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

目录 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 1.2、打包项目&#xff08;jar&#xff09; 1.3、编写 Dockerfile 文件&#xff0c;构建镜像 1.4、运行镜像并测试 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 a&#xff09;简…...

论文查重降重写成大白话可以吗

大家好&#xff0c;今天来聊聊论文查重降重写成大白话可以吗&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 论文查重降重&#xff1a;用大白话解析 一、引言 写论文是每个…...

【WPF.NET开发】WPF中的命令

本文内容 什么是命令WPF 中的简单命令示例WPF 命令中的四个主要概念命令库创建自定义命令 命令是 Windows Presentation Foundation (WPF) 中的一种输入机制&#xff0c;与设备输入相比&#xff0c;它提供的输入处理更侧重于语义级别。 示例命令如许多应用程序均具有的“复制…...

网站建设的相关技术/网络推广代理

我不是作者的程序P需要阅读F.我希望F的内容来自另一个’生成器’程序G,每当P试图读取F(将F作为普通文件)而不是之前的任何时候.我尝试过以下操作&#xff1a;$mkfifo /well-known/path/to/F # line #1$G > /well-known/path/to/F # line #2现在,当P启动并尝试读取F时,它似乎…...

wordpress微擎/日照seo公司

在 ECMAScript 规范中&#xff0c;共定义了 7 种数据类型&#xff0c;分为 基本类型 和 引用类型 两大类&#xff0c;如下所示&#xff1a; 基本类型&#xff1a;String、Number、Boolean、Symbol、Undefined、Null 引用类型&#xff1a;Object 基本类型也称为简单类型&#x…...

公司商城网站建设/网域名查询地址

对于移动平台上的RPG类的游戏&#xff0c;我们常用虚拟摇杆来控制人物角色的行走和一些行为&#xff0c;相信我们对它并不陌生&#xff0c;之前尝试了EasyTouch2.5&#xff0c;发现并没有最新版的3.1好用&#xff0c;2.5版本的对于自适应没有做的很好&#xff0c;而最新版的已经…...

真正做新闻网站/站内seo和站外seo区别

1.首先IP地址为&#xff1a;10.20.105.145 方法1&#xff1a; 1.用wps有个双面打印&#xff0c;然后打印完需要把打印完单面的纸给纵向翻转&#xff0c;让有字体的那一面朝上&#xff0c;并且字的朝向为右&#xff0c;最后一步就是把这些纸的最上面的挪到最下面&#xff0c;依…...

外网访问wordpress版式不对/百度关键词下拉有什么软件

链表 在内存空间中&#xff0c;数组和链表都是基本的数据结构&#xff0c;都是【表】&#xff0c;或者叫【线性表】。线性表是一个线性结构&#xff0c;它是一个含有n≥0个结点的有限序列&#xff0c;对于其中的结点&#xff0c;有且仅有一个开始结点没有前驱但有一个后继结点…...

网站设计需要多少钱/今日的最新消息

摘要&#xff1a;本文目的是了解Owin基本原理。讲述如何从控制台创建一个自宿主的OwinHost&#xff0c;然后再编写一两个中间件 准备工作 首先通过VisualStudio创建一个控制台应用 然后添加Owin的Nuget包引用 需要的包如下 Owin Microsoft.Owin Microsoft.Owin.Hosting Microso…...