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…

网络通信(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…

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

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

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

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

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% (…

强直性脊柱炎=“不死的癌症”?这些常识你不可不知→

对强直性脊柱炎这个疾病&#xff0c;大家最常听说的是&#xff1a;强直性脊柱炎症状重、治疗难&#xff0c;会逐渐引发关节畸形、功能丧失&#xff0c;甚至残疾&#xff0c;被称为「不死的癌症」。 然而&#xff0c;近来越来越多患有强直性脊柱炎的明星活跃在荧幕上&#xff0c…

材料表征的微观探测器——台阶高度测量技术概述

一、引言 表面特征是材料、化学等领域的不可或缺的主要研究内容&#xff0c;合理地评价表面形貌、表面特征等&#xff0c;对于相关材料的评定、性能的分析和加工条件的改善都具有重要的意义。 表面台阶高度测量在材料表面研究中有十分重要的作用。一方面&#xff0c;表面测量…

x-cmd pkg | busybox - 嵌入式 Linux 的瑞士军刀

目录 简介首次用户功能特点竞品和相关作品 进一步阅读 简介 busybox 是一个开源的轻量级工具集合&#xff0c;集成了一批最常用 Unix 工具命令&#xff0c;只需要几 MB 大小就能覆盖绝大多数用户在 Linux 的使用&#xff0c;能在多款 POSIX 环境的操作系统&#xff08;如 Linu…

避免重复扣款:分布式支付系统的幂等性原理与实践

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;6&#xff09;篇。 本文主要讲清楚什么是幂等性原理&#xff0c;在支付系统中的重要应用&#xff0c;业务幂等、全部幂等这些不同的幂等方案选型带来的收益和复杂度权衡&#xff0c;幂等击穿场景及可能的严重…

k8s源码阅读环境配置

源码阅读环境配置 k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理&#xff0c;同时提升我们Go编程能力。 IDE使用Goland&#xff0c;代码阅读环境需要进行如下配置&#xff1a; 从github上下载代码&#xff1a;https://github.com/kubernetes/kubernetes在GOPATH目…

CTF-PWN-沙箱逃脱-【seccomp和prtcl-2】

文章目录 沙箱逃脱prtcl题HITCON CTF 2017 Quals Impeccable Artifactflag文件对应prctl函数检查源码思路exp 沙箱逃脱prtcl题 HITCON CTF 2017 Quals Impeccable Artifact flag文件 此时的flag文件在本文件夹建一个即可 此时的我设置的flag为 对应prctl函数 第一条是禁止…

JavaScript解构赋值完全手册

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ 目录 ✨ 前言 第一节:解构赋值的基本用法 第二节:对象解构赋值 第三节:数组解构赋值 第四节:参数…

Fluids —— MicroSolvers DOP

目录 Gas SubStep —— 重复执行对应的子步 Switch Solver —— 切换解算器 Gas Attribute Swap —— 交换、复制或移动几何体属性 Gas Intermittent Solve —— 固定时间间隔计算子解算器 Gas External Forces —— 计算外部力并更新速度或速度场 Gas Particle Separate…