Springboot3(一、lambda、::的应用)

文章目录

  • 一、使用lambda简化实例创建
    • 1.语法:
    • 2.示例:
    • 3.Function包
      • 3.1 有入参,有返回值【多功能函数】
      • 3.2 有入参,无返回值【消费者】
      • 3.3 无入参,有返回值【提供者】
      • 3.4 无入参,无返回值
  • 二、类::方法的使用
  • 三、综合练习
    • 总结

Spring Boot 支持 Lambda 函数式编程,好处:

  • 简洁性:使用 Lambda 表达式可以大大减少代码的冗余。Lambda 表达式可以将一个功能单元以更简洁的方式传递给方法或函数接口,不需要显式地声明匿名内部类,从而减少了样板代码。
  • 可读性:Lambda 表达式可以使代码更加易读和易理解。通过使用简洁的语法,可以更清晰地表达代码的意图,提高代码的可读性。
  • 函数式编程风格:Lambda 表达式使得函数式编程范式更容易实现。通过使用函数接口(Functional Interface)作为方法的参数类型,可以更方便地使用 Lambda 表达式来处理集合、过滤数据等操作,从而使代码更加简洁和可维护。
  • 并行处理:Lambda 表达式可以很容易地与 Java 8 中引入的并行处理框架结合使用,实现更高效的并行计算。通过并行处理,可以充分利用多核处理器的优势,提高程序的性能。
  • 更好的代码组织:使用 Lambda 表达式可以将代码逻辑更好地组织起来,提高代码的模块化和可重用性。通过将功能单元封装在 Lambda 表达式中,可以将代码逻辑组织得更加紧凑和一致。

一、使用lambda简化实例创建

  • lambda表达式适用于函数式接口
  • 函数式接口:接口中只有一个未实现的接口
  • FunctionalInterface注解可以判断接口是否是函数式接口

1.语法:

(参数) ->  {方法体;return 返回值;
};

lambda可以根据参数,返回值内容不同,简化程度不同:

  • 无参:() -> {方法体;return 返回值;};
  • 单个参:参数 -> 返回值;
  • 多个参(参数不需要定义类型):(参数,参数……) -> {方法体;return 返回值;};
  • 方法体如果只有一句话,可以省略{}。

2.示例:

package com.example.lambda;interface SumTest {int sum(int i, int j);
}interface EmptyTest {int sum();
}// FunctionalInterface 检查是否是函数式接口
@FunctionalInterface
interface ManyTest {int sum(int i);// 当接口中出现多个未实现方法的时候,就不算函数式接口了,使用lambda会报错//int add();// 实现方法,默认返回1default int add(){return 1;}
}class SumTestImpl implements SumTest {@Overridepublic int sum(int i, int j) {return i * j;}}
/*** 使用lambda简化实例创建代码* 1.lambda表达式适用于函数式接口* 2.函数式接口:接口中只有一个未实现的接口* 语法:(参数) -> {方法体;返回值;};*/
public class Lambda {public static void main(String[] args) {// 普通方式SumTestImpl sum = new SumTestImpl();System.out.println(sum.sum(1, 6));// 普通方式SumTest sum1 = new SumTest() {@Overridepublic int sum(int i, int j) {return i * j;}};System.out.println(sum1.sum(2, 6));// lambda方式:方法体可以自定义SumTest sumLambda = (int i, int j) -> {return i * j;};System.out.println(sumLambda.sum(3, 6));// lambda方式,简化参数类型写法SumTest sumLambda1 = (i, j) -> {return i * j + i * j;};System.out.println(sumLambda1.sum(3, 6));// 单个参数时,不需要小括号ManyTest test = i -> {return i+i;};System.out.println(test.sum(3));// 单个参数,最简写法test = i -> i+i;System.out.println(test.sum(3));// 无参时,直接小括号即可EmptyTest empty = () -> {return 1;};System.out.println(empty.sum());}
}

3.Function包

在这里插入图片描述
Function中包含着很多函数式接口供我们使用,下面将例举几个:

  • Function<T, R>:
    R apply(T t):对给定的参数类型 T 进行操作,并返回一个结果类型为 R 的值。
  • BiFunction<T, U, R>:
    R apply(T t, U u):对给定的参数类型 T 和 U 进行操作,并返回一个结果类型为 R 的值。
  • UnaryOperator(继承自 Function<T, T>):
    T apply(T t):对给定的参数类型 T 进行操作,并返回一个结果类型仍为 T 的值。
  • BinaryOperator(继承自 BiFunction<T, T, T>):
    T apply(T t1, T t2):对给定的参数类型 T 进行操作,并返回一个结果类型仍为 T 的值。
  • Predicate:
    boolean test(T t):对给定的参数类型 T 进行条件判断,返回一个 boolean 值。
  • BiPredicate<T, U>:
    boolean test(T t, U u):对给定的参数类型 T 和 U 进行条件判断,返回一个 boolean 值。
  • Consumer:
    void accept(T t):对给定的参数类型 T 进行处理,没有返回值。
  • BiConsumer<T, U>:
    void accept(T t, U u):对给定的参数类型 T 和 U 进行处理,没有返回值。
  • Supplier:
    T get():获取一个类型为 T 的结果,常用于延迟计算或提供默认值。
  • Runnable:
    void run():执行一些简单的代码块,没有参数和返回值。

3.1 有入参,有返回值【多功能函数】

Function源码如下:

@FunctionalInterface
public interface Function<T, R> {/*** Applies this function to the given argument.** @param t the function argument* @return the function result*/R apply(T t);
}

使用示例

Function<Integer, String> function = i -> "使用apply方法,i是入参,此处是返回值"+i;
function.apply(1);

3.2 有入参,无返回值【消费者】

BiConsumer源码如下:

@FunctionalInterface
public interface BiConsumer<T, U> {/*** Performs this operation on the given arguments.** @param t the first input argument* @param u the second input argument*/void accept(T t, U u);
}

使用示例

BiConsumer<Integer, String> biConsumer = (c, str) -> System.out.println("使用BiConsumer实现有参,无返回值");
biConsumer.accept(1,"test");

3.3 无入参,有返回值【提供者】

Supplier源码如下:

@FunctionalInterface
public interface Supplier<T> {/*** Gets a result.** @return a result*/T get();
}

使用示例

var list = new ArrayList<Integer>();
list.add(322);
list.add(452);
list.add(621);
list.add(846);
list.add(223);
Collections.sort(list, Integer::compareTo);
Supplier<List> supplier = () -> list;
System.out.println(supplier.get());

3.4 无入参,无返回值

Runnable源码如下:

@FunctionalInterface
public interface Runnable {/*** When an object implementing interface {@code Runnable} is used* to create a thread, starting the thread causes the object's* {@code run} method to be called in that separately executing* thread.* <p>* The general contract of the method {@code run} is that it may* take any action whatsoever.** @see     java.lang.Thread#run()*/public abstract void run();
}

使用示例

Runnable runnable = () -> System.out.println("run起来");
runnable.run();

二、类::方法的使用

public static void main(String[] args) {var list = new ArrayList<Integer>();list.add(322);list.add(452);list.add(621);list.add(846);list.add(223);Collections.sort(list,(o1, o2) -> o1.compareTo(o2));Collections.sort(list, Integer::compareTo);
}

Integer::compareTo == (o1, o2) -> o1.compareTo(o2),就是引用Integer中的compareTo方法进行排序。
此处可以直接使用”::“进行简化。

三、综合练习

判断字符是否为数字,如果是数字就打印出来。

    public static void main(String[] args) {// 使用supplier输出一个字符Supplier<String> supplier = () -> "111";// 使用断言判断是否为数字Predicate<String> predicate = str -> str.matches("\\d+");// 字符串转数字Function<String, Integer> function = Integer::parseInt;// 消费数据Consumer<Integer> co = c -> {System.out.println("输入的字符是数字:"+c);};String str = supplier.get();if(predicate.test(str)){co.accept(function.apply(str));}else{System.out.println("输入的字符不是数字");}}

总结

java util function包下的所有function定义:

  • Consumer: 消费者
  • Supplier:提供者
  • Predicate: 断言

get/test/apply/accept调用的函数方法;

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

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

相关文章

如何彻底卸载Edge

要彻底卸载Edge浏览器&#xff0c;你可以按照以下几种方法操作&#xff1a; 方法一&#xff1a;使用控制面板 点击任务栏的“开始”按钮&#xff0c;打开“控制面板”。在控制面板中&#xff0c;选择“程序和功能”。在程序列表中找到Edge浏览器&#xff0c;右键点击它并选择…

web左侧伸缩菜单栏/导航栏

效果展示&#xff1a; 百度网盘链接下载全部资源&#xff1a; http://链接&#xff1a;https://pan.baidu.com/s/1ZnKdWxTH49JhqZ7Xd-cJIA?pwd4332 提取码&#xff1a;4332 html/JQuery代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head&g…

SpringCloud GateWay实现路由限流

目录 RequestRateLimiterGatewayFilterFactory令牌桶算法实现限流 RequestRateLimiterGatewayFilterFactory Spring Cloud Gateway 内置了一个限流功能的过滤器工厂&#xff0c;那就是RequestRateLimiterGatewayFilterFactory &#xff0c;它使用 Redis 和 Lua 脚本实现令牌桶…

搭建大数据开发环境【AutoDL容器】

租用AutoDL容器 注意&#xff1a;结束实验时记得将数据库数据转移存储 使用Docker实现本地IDEA连接AutoDL 后为ssh服务器地址用户名为前的端口号ssh密码为用户密码 安装JDK 压缩包安装 Java下载地址&#xff1a;Oracle Java Download&#xff08;hadoop不指定特定版本java&…

机器学习 -决策树的案例

场景 我们对决策树的基本概念和算法其实已经有过了解&#xff0c;那我们如何利用决策树解决问题呢&#xff1f; 构建决策树 数据准备 我们准备了一些数据如下&#xff1a; # 定义新的数据集 new_dataSet [[晴朗, 是, 高, 是],[雨天, 否, 低, 否],[阴天, 是, 中, 是],[晴朗…

关于接口接收一个集合作为参数后,测试时的异常

情景再现&#xff1a; 接口 PostMapping("/aa") public String setDoubtList(RequestBody List<user> userList){//接收一个list<user>&#xff0c;return userService.setUserList(userlist);} 测试接口时传入body内容 {"user":[{"n…

网络通信(11)-C#TCP服务端封装帮助类实例

本文使用Socket在C#语言环境下完成TCP服务端封装帮助类的实例。 实例完成的功能: 服务器能够连接多个客户端显示在列表中,实现实时刷新。 服务器接收客户端的字符串数据。 选中列表中的客户端发送字符串数据。 在VS中创建C# Winform项目,编辑界面,如下: UI文件 name…

Java中SpringBoot组件集成接入【MQTT中间件】

Java中SpringBoot组件集成接入【MQTT中间件】 1.MQTT介绍2.搭建MQTT服务器1.Windows2.Ubuntu3.Docker4.其他方式3.mqtt可视化客户端MQTTX及快速使用教程4.SpringBoot接入MQTT1、maven依赖2、MQTT配置3、MQTT组件具体代码1.定义通道名字2.消息发布器3.MQTT配置、生产者、消费者4…

.NET学习教程一——.net基础定义+VS常用设置

一、定义 .NET分为.NET平台和.NET框架。 .NET平台&#xff08;厨房&#xff09;.NET FrameWork 框架&#xff08;柴米油盐酱醋茶&#xff09; .NET平台&#xff08;中国移动联通平台&#xff09;.NET FrameWork 框架&#xff08;信号塔&#xff09; .NET平台基于.NET Fra…

强化学习的数学原理学习笔记 - 值函数近似(Value Function Approximation)

文章目录 概览&#xff1a;RL方法分类值函数近似&#xff08;Value function approximation&#xff09;Basic idea目标函数&#xff08;objective function&#xff09;优化算法&#xff08;optimization algorithm&#xff09; Sarsa / Q-learning with function approximati…

JS输出为[object object]取值问题

问题&#xff1a;页面跳转传参 传参前数据能打印出来&#xff0c;传参后显示[object object]且无法取值 解决 传递 接收后端返回的json对象通常是一个字符串类型的object 所以 通过 JSON.stringify() 把 JavaScript 对象转换为字符串。 my.navigateTo({url: /pages/compo…

学生备考哪款护眼台灯好?2024五款知名品牌强力推荐

最近应后台小伙伴要求&#xff0c;给大家测评一些护眼台灯产品&#xff0c;毕竟现在的孩子近视人数真的非常多&#xff0c;每五个孩子戴眼镜的就有三个了&#xff0c;日常学习中保护视力&#xff0c;由于很多学习时间都是在晚上&#xff0c;台灯成为了为陪伴学习不可或缺的搭档…

深度学习:图神经网络——在推荐系统中的应用

PinSage是工业界应用图神经网络完成推荐任务的第一个成功案例&#xff0c;其从用户数据中构造图&#xff08;graph&#xff09;的方法和应对大规模图而采取的实现技巧都值得我们学习。PinSage被应用在图片推荐类Pinterest上。在Pinterest中&#xff0c;每个用户可以创建并命名图…

C++中如何在另一个类中使用主函数中的创建的类对象?

文章目录 要在 C 中在另一个类中使用主函数中创建的类对象&#xff0c;通常有几种方法。一种常见的做法是通过构造函数将对象作为引用或指针传递。以下是一个简单的例子&#xff0c;展示了这种做法&#xff1a; 假设我们有两个类 MyClass 和 OtherClass。我们想在 OtherClass …

TikTok电商年度洞察:出海到底“卖什么”?各国多类目爆款洞察,迅速掌握市场领先优势

很多卖家在尝试出海时&#xff0c;常面临两大核心痛点&#xff1a;一是“卖什么”&#xff0c;即选择何种商品进行销售&#xff1b;二是“怎么卖”&#xff0c;即如何通过有效的营销策略将商品销售出去。TikTok主打的内容电商模式&#xff0c;通过短视频和直播等形式&#xff0…

StampedLock锁探究

该锁提供了三种模式的读写控制&#xff0c;当调用获取锁的系列函数时&#xff0c;会返回一个long型的变量&#xff0c;我们称之为戳记(stamp),这个戳记代表了锁的状态。 其中try系列获取锁的函数&#xff0c;当获取锁失败后会返回为0的stamp 值。 当调用释放锁和转换锁的方法…

汽车中的ECU、VCU、MCU、HCU

一、ECU是汽车电脑&#xff0c;刷汽车电脑可以提高动力&#xff0c;也可以减低动力&#xff0c;看需求。 简单原理如下。 1.汽车发动机运转由汽车电脑&#xff08;即ECU&#xff09;控制。 2.ECU控制发动机的进气量&#xff0c;喷油量&#xff0c;点火时间等&#xff0c;从而…

成功解决使用git clone下载失败的问题: fatal: 过早的文件结束符(EOF) fatal: index-pack 失败

一.使用 http 可能出现的问题和解决 1.问题描述 ~$ git clone https://github.com/oKermorgant/ecn_baxter_vs.git 正克隆到 ecn_baxter_vs... remote: Enumerating objects: 13, done. remote: Counting objects: 100% (13/13), done. remote: Compressing objects: 100% (…

how to use pythonizer to transfer perl to python

git clone https://github.com/softpano/pythonizer export PERL5LIB/home/prometheus/pythonizer cd /home/prometheus/pythonizer ./pythonizer yourperlfile.plresult:you will get yourperlfile.py

Linux 系统日志及其归档

主要记录Linux 系统需要关注的日志文件&#xff0c;以及日志归档服务 rsyslogd 系统日志服务 rsyslogd 日志服务 rsyslogd reliable and extended syslogd 可靠 可扩展的系统日志服务 Rsyslogd是一个系统实用程序&#xff0c;提供对消息日志记录的支持。同时支持internet和uni…