Lambda表达式用法汇总

Lambda表达式用法汇总

java8 中引入的 Lambda 表达式真的是个好东西,掌握之后,写代码更简洁了,码字效率也提升了不少,这里咱

们一起来看看 Lambada 表达式常见的写法,加深理解。

1、有参无返回值函数式接口 8 种写法

1.1、先来定义一个函数式接口

  • 有 2 个参数
  • 无返回值
@FunctionalInterface
public interface Fun {void print(String s1, String s2);
}

创建 Fun 有 8 种写法。

1.2、第 1 种:原始的写法如下

Fun fun1 = new Fun() {@Overridepublic void print(String s1, String s2) {String msg = s1 + "," + s2;System.out.println(msg);}
};

1.3、第 2 种:Lambda 方式完整写法

Fun fun2 = (String s1,String s2) -> {String msg = s1 + "," + s2;System.out.println(msg);
};

1.4、第 3 种:Lambda 方式隐藏参数类型

Fun fun3 = (s1, s2) -> {String msg = s1 + "," + s2;System.out.println(msg);
};

1.5、第 4 种:Lambda 方式单行可去掉{}

Fun fun4 = (s1, s2) -> System.out.println(s1 + "," + s2);

1.6、第 5 种:Lambda 方式引用静态方法

添加一个静态方法

public static class StaticMethod {public static void print(String s1, String s2) {String msg = s1 + "," + s2;System.out.println(msg);}
}

继续简写 Fun,如下

Fun fun5 = (s1, s2) -> StaticMethod.print(s1,s2);

1.7、第 6 种:Lambda 方式使用::引用静态方法,隐藏参数

若静态方法的参数和函数式接口的方法参数一致,可以对下面代码继续优化

Fun fun5 = (s1, s2) -> StaticMethod.print(s1,s2);

可以优化为下面这样

Fun fun6 = StaticMethod::print;

1.8、第 7 种:Lambda 方式引用实例方法

添加一个实例对象,内部添加一个实例方法

public static class InstanceMethod {public void print(String s1, String s2) {String msg = s1 + "," + s2;System.out.println(msg);}
}

继续简写 Fun,如下

InstanceMethod instanceMethod = new InstanceMethod();
Fun fun7 = (s1, s2) -> instanceMethod.print(s1,s2);

1.9、第 8 种:Lambda 方式使用::实例态方法,隐藏参数

若实例方法的参数和函数式接口的方法参数一致,可以对下面代码继续优化

Fun fun7 = (s1, s2) -> instanceMethod.print(s1,s2);

优化为下面这样

Fun fun8 = instanceMethod::print;

2、无参有返回值函数式接口 8 种写法

2.1、来一个有返回值的函数式接口

  • 函数式接口 UserFun 中有个 createUser 方法用来创建 User 对象
  • User 类有 2 个属性,定义了 2 个构造方法
  • StaticMethod 提供了一个静态方法 user()用来创建 User 对象
  • InstanceMethod 提供了一个实例方法 user()用来创建 User 对象
@FunctionalInterface
public interface UserFun {User createUser();
}public static class User {private String name;private Integer age;public User() {}public User(String name, Integer age) {this.name = name;this.age = age;}
}
public static class StaticMethod {public static User user() {return new User("张三", 30);}
}public static class InstanceMethod {public User user() {return new User("张三", 30);}
}

创建 UserFun 有 8 种方式,下面来看各种方式演化的过程。

2.2、创建 UserFun 的 8 种写法

@Test
public void test1() {//方式1:原始方式UserFun fun1 = new UserFun() {@Overridepublic User createUser() {return new User("张三", 30);}};//方式2:Lambda玩转方式()->{方法体;}UserFun fu2 = () -> {return new User("张三", 30);};//方式3:方法体只有一行,可去掉{}UserFun fun3 = () -> new User("张三", 30);//方式4:调用静态方法UserFun fun4 = () -> {return StaticMethod.user();};//方式5:去掉{}UserFun fun5 = () -> StaticMethod.user();//方式6:使用::调用静态方法UserFun fun6 = StaticMethod::user;InstanceMethod instanceMethod = new InstanceMethod();//方式7:实例方法UserFun fun7 = () -> instanceMethod.user();//方式8:实例对象::实例方法UserFun fun8 = instanceMethod::user;
}

2.3、第 9 种方式:类::new 的

代码如下,下面 2 种创建方式类似,第一种是第二种的简写。

//方式9:类::new的方式
UserFun fun9 = User::new;
//这个相当于
UserFun fun10 = new UserFun(){@Overridepublic User createUser() {return new User();}
};

3、有参有返回值的函数式接口

3.1、来一个有参、有返回值的函数式接口

  • 函数式接口 UserFun 中有个有参的 createUser(String name,Integer age)方法用来创建 User 对象
  • User 类有 2 个属性,定义了 1 个有参构造方法
  • StaticMethod 提供了一个静态方法 user(String name,Integer age)用来创建 User 对象
  • InstanceMethod 提供了一个实例方法 user(String name,Integer age)用来创建 User 对象
@FunctionalInterface
public interface UserFun {User createUser(String name, Integer age);
}public static class User {private String name;private Integer age;public User(String name, Integer age) {this.name = name;this.age = age;}
}public static class StaticMethod {public static User user(String name, Integer age) {return new User(name, age);}
}public static class InstanceMethod {public User user(String name, Integer age) {return new User(name, age);}
}

3.2、创建 UserFun 的 11 种写法

//方式1:原始方式
UserFun fun1 = new UserFun() {@Overridepublic User createUser(String name, Integer age) {return new User(name, age);}
};//方式2:Lambda玩转方式()->{方法体;}
UserFun fun2 = (String name, Integer age) -> {return new User(name, age);
};//方式3:方法体只有一行,可去掉{}
UserFun fun3 = (String name, Integer age) -> new User("张三", 30);//方式4:隐藏参数类型
UserFun fun4 = (name, age) -> new User("张三", 30);//方式5:调用静态方法
UserFun fun5 = (String name, Integer age) -> {return StaticMethod.user(name, age);
};//方式6:隐藏参数类型,单行可以去掉{}和return
UserFun fun6 = (name, age) -> StaticMethod.user(name, age);//方式7:使用::调用静态方法,参数类型数量需要和静态方法一致
UserFun fun7 = StaticMethod::user;InstanceMethod instanceMethod = new InstanceMethod();
//方式8:调用实例方法
UserFun fun8 = (String name, Integer age) -> {return instanceMethod.user(name, age);
};//方式9:隐藏参数类型,单行可以去掉{}和return
UserFun fun9 = (name, age) -> instanceMethod.user(name, age);//方式10:使用::调用静态方法,参数类型数量需要和实例方法一致
UserFun fun10 = instanceMethod::user;//方式11:类::new的方式,函数接口中的方法参数需要和User类中构造方法的参数类型数量一致
UserFun fun11 = User::new;
//这个相当于
UserFun fun12 = new UserFun(){@Overridepublic User createUser(String name,Integer age) {return new User(name,age);}
};

4、无参无返回值

Runnable a1 = () -> System.out.println("Hello");
new Thread(a1).start();
a1.run();

5、特殊案例

下面这个案例比较特殊,下面列出了 5 种写法,这几种写法效果是一样的。

方式 5 比较特殊,注意看注释,大家领会领会。

public class LambdaTest4 {@FunctionalInterfacepublic interface Fun {String dispose(String s1, String s2);}@Testpublic void test1() {//方式1:原始写法Fun fun1 = new Fun() {@Overridepublic String dispose(String s1, String s2) {return s1.concat(s2);}};//方式2:lambda玩转写法Fun fun2 = (String s1, String s2) -> {return s1.concat(s2);};//方式3:单行可以隐藏{}和returnFun fun3 = (String s1, String s2) -> s1.concat(s2);//方式4:隐藏参数Fun fun4 = (s1, s2) -> s1.concat(s2);/*** 方式5:类::方法,这种写法需要满足* 1、函数接口方法的第1个参数类型需要和{类名::方法}中的类名是同种类型* 2、第1个参数后面的参数将作为{类名::方法}中方法的参数,注意下面的concat方法只有1个参数*/Fun fun5 = String::concat;}
}

6、使用

6.1、有参无返回值函数式接口

package com.example.lambdatest;/*** @author zhangshixing* 有参无返回值函数式接口*/
public class Test1 {public static void main(String[] args) {Fun fun = (String s1, String s2) -> {String msg = s1 + "," + s2;System.out.println(msg);};// hello,worldfun.print("hello", "world");}@FunctionalInterfacepublic interface Fun {void print(String s1, String s2);}
}

6.2、无参有返回值函数式接口

package com.example.lambdatest;/*** @author zhangshixing* 无参有返回值函数式接口*/
public class Test2 {public static void main(String[] args) {Fun fun = () -> "Hello,World";String returnStr = fun.getNumber();System.out.println(returnStr);}@FunctionalInterfacepublic interface Fun {String getNumber();}
}

6.3、有参有返回值的函数式接口

package com.example.lambdatest;/*** @author zhangshixing* 有参有返回值的函数式接口*/
public class Test3 {public static void main(String[] args) {Fun fun = (a, b) -> a + b;int result = fun.add(1,2);System.out.println(result);}@FunctionalInterfacepublic interface Fun {int add(int a, int b);}
}

6.4 无参无返回值

Runnable a1 = () -> System.out.println("Hello");
new Thread(a1).start();
a1.run();

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

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

相关文章

【代码随想录】算法训练计划39

dp 1、62. 不同路径 题目: 求路径方案多少个 思路: 这道题就有点dp了哈 func uniquePaths(m int, n int) int {//dp,写过,代表的是多少种// 初始化dp : make([][]int, m)for i : range dp {dp[i] make([]int, n)dp[i][0] 1 // 代表到…

用友NC Cloud FileParserServlet反序列化RCE漏洞复现

0x01 产品简介 用友 NC Cloud 是一种商业级的企业资源规划云平台,为企业提供全面的管理解决方案,包括财务管理、采购管理、销售管理、人力资源管理等功能,实现企业的数字化转型和业务流程优化。 0x02 漏洞概述 用友 NC Cloud FileParserServlet接口存在反序列化代码执行漏…

response应用

文章目录 [TOC](文章目录) response说明一、response文件下载二、待补充。。。 response说明 response是指HttpServletResponse,该响应有很多的应用,比如像浏览器输出消息,下载文件,实现验证码等。 一、response文件下载 1.创建一个javaw…

springboot整合swagger

1)简介: 作为后端开放人员,最烦的事就是自己写接口文档和别人没有写接口文档,不管是前端还是后端开发,多多少少都会被接口文档所折磨,前端会抱怨后端没有及时更新接口文档,而后端又会觉得编写接…

Spark-03: Spark SQL 基础编程

目录 1.Spark SQL 简介 2.SparkSession 3.Spark SQL 数据的读写 3.1 读写 TXT 文件 3.2 读写 CSV 文件 3.3 读写 JSON 文件 3.4 读写 Parquet 文件 3.5 读写 ORC 文件 3.6 读写MySQL数据库 4.Spark SQL 语法 4.1 SQL 语法 4.2 DSL 语法 1.Spark SQL 简介 Spark SQL…

备份和恢复Linux服务器上的HTTP配置

备份和恢复Linux服务器上的HTTP配置是一项重要的任务,它可以确保您的服务器在出现故障或配置错误时能够迅速恢复正常运行。下面我们将介绍如何备份和恢复Linux服务器上的HTTP配置。 备份HTTP配置 登录到Linux服务器上,并使用root权限。 备份HTTP配置文…

分部积分法

1.形式:u对v求积分uv-v对u求积分,一前一后,一般把三角函数,反三角函数,In,e的x次方提到d里面 2. 3. 4. 5. 6. 7. 当结果中出现要求的不要慌,不是1直接求,是1重新计算

一体化污水处理设备材质怎么选

在环保意识日益增强的今天,污水处理设备成为城市建设过程中的重要环节。而选择合适的一体化污水处理设备材质,则成为了一项重要的决策。本文将从专业的角度出发,为您解析一体化污水处理设备材质的选取。 首先,一体化污水处理设备材…

postman常用脚本

在参数中动态添加开始时间和结束时间的时间戳 1.先在collection中添加参数,这里的作用域是collection,也可以是其他的任何scope 2.在Pre-request Script 中设定开始时间和结束时间参数,比如昨天和今天的时间戳,下面是js代码 con…

Android Studio Hedgehog | 2023.1.1(刺猬)

Android Gradle 插件和 Android Studio 兼容性 Android Studio 构建系统基于 Gradle,并且 Android Gradle 插件 (AGP) 添加了一些特定于构建 Android 应用程序的功能。下表列出了每个版本的 Android Studio 所需的 AGP 版本。 Android Studio versionRequired AG…

Kubernetes 常用命令

集群信息&#xff1a; 1. 显示 Kubernetes 版本&#xff1a;kubectl version2. 显示集群信息&#xff1a;kubectl cluster-info3. 列出集群中的所有节点&#xff1a;kubectl get nodes4. 查看一个具体的节点详情&#xff1a;kubectl describe node <node-name>5. 列出所…

python学习:opencv+用鼠标画矩形和圆形

目录 步骤 定义数据 新建一个窗口黑色画布 显示黑色画布 添加鼠标回调函数 循环 一直显示图片 一直判断有没有按下字母 m 关闭所有窗口 鼠标回调函数 步骤 当鼠标按下记录坐标并记录鼠标标记位为true&#xff0c;移动的时候就会不断的画矩形或者圆&#xff0c;松下的时候就再…

vue项目通过宝塔部署之后,页面刷新后浏览器404页面

转载&#xff1a;vue项目通过宝塔部署之后&#xff0c;页面刷新后浏览器404页面。

ioc循环依赖怎么解决

在使用IoC&#xff08;Inversion of Control&#xff09;容器时&#xff0c;循环依赖是一个常见的问题。不同的IoC容器提供了不同的解决方案。在Spring框架中&#xff0c;常用的解决循环依赖的注解是 Lazy 和 Autowired。 1.Lazy 注解&#xff1a; 在Spring中&#xff0c;Lazy…

STM32F1中断NVIC

目录 1. 中断系统 2. 中断向量表 3. NVIC基本结构 4. NVIC优先级分组 5. NVIC程序编写 5.1 中断分组 5.2 中断结构体变量 5.3 中断通道选择 5.4 抢占优先级和响应优先级配置 6. 中断程序执行 1. 中断系统 中断&#xff1a;在主程序运行过程中&#xff0…

如何设计自动化测试脚本

企业中如何设计自动化测试脚本呢&#xff1f;今天我们就来为大家分享一些干货。 一、线性设计 线性脚本设计方式是以脚本的方式体现测试用例&#xff0c;是一种非结构化的编码方式&#xff0c;多数采用录制回放的方式&#xff0c;测试工程师通过录制回访的访问对被测系统进行…

基于JSDoc实现TypeScript类型安全的实践报告

在FEDay 2023中我讲了《从JS到TS无缝迁移的实践报告》【视频在这里在这里】&#xff0c;是将一个传统的JS项目&#xff08;mochajs/mocha&#xff09;迁移到TypeScript环境的全程。其中提到了一件事情&#xff0c;就是“可以通过JSDoc/TSDoc来生成.d.ts”&#xff0c;从而实现T…

FastAPI的路由

前言 回想一下我们在hello world程序里面做了哪些事情&#xff1f; 还是先把那段著名的程序的代码贴出来欣赏一下吧。 from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}app.get(&q…

mvc模式test2

关于上篇book.java中使用类型不一样导致的报错 是在bookdao.java中解决 bookservlet.java package servlet; import java.io.IOException; import beans.Book; import dao.BookDao; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servl…

RabbitMQ的消息发送和接收机制

所有 MQ 产品从模型抽象上来说都是一样的过程&#xff1a; 消费者&#xff08;consumer&#xff09;订阅某个队列。生产者&#xff08;producer&#xff09;创建消息&#xff0c;然后发布到队列&#xff08;queue&#xff09;中&#xff0c;最后将消息发送到监听的消费者。 上…