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.hqwc.cn/news/336346.html

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

相关文章

首家通过中国信通院数据库迁移工具专项测试,亚信安慧AntDB受到认可!

亚信安慧数据库数据同步平台经过中国信通院第17批“可信数据库”数据库迁移工具专项测试&#xff0c;成功成为首家符合《数据库迁移工具能力要求》的产品。该平台广泛适用于多种数据迁移场景&#xff0c;具备高性能实时数据处理、断点续作、一键迁移、可视化运维等核心优势。此…

国芯科技荣膺高工智能汽车“年度车规MCU高成长供应商”,加速产品精准化系列化布局

2023年12月13—15日&#xff0c;2023&#xff08;第七届&#xff09;高工智能汽车年会在上海召开&#xff0c;大会以“寻找拐点”为主题&#xff0c;通过超80场主题演讲及多场圆桌对话&#xff0c;为智能汽车赛道参与者「备战2024」提供全方位的决策支持。 作为汽车电子芯片领…

Flutter使用stack来实现悬浮UI

文章目录 stack特性示例 stack特性 在Flutter中&#xff0c;你可以使用Stack和Positioned来创建悬浮 UI。Stack允许你将多个小部件叠放在一起&#xff0c;而Positioned则用于定位小部件在Stack中的位置。 示例 以下是一个简单的示例&#xff0c;演示如何创建一个悬浮按钮&am…

阿里云购买云服务器选择经济型、通用算力型、计算型、通用型、内存型实例哪个好?

在我们通过阿里云的活动选购云服务器的时候会发现&#xff0c;相同配置的云服务器往往有多个不同的实例可选&#xff0c;而且价格差别也比较大&#xff0c;这会是因为不同实例规格的由于采用的处理器不同&#xff0c;底层架构也有所不同&#xff08;例如X86 计算架构与Arm 计算…

.NetCore部署微服务(二)

目录 前言 概念 一 Consul注册服务中心 1.1 consul下载 1.2 consul运行 二 服务注册 2.1 安装Consul包 2.2 修改配置文件 2.3 注入Consul服务 2.3 修改Controller&#xff0c;增加HealthCheck方法 三 运行服务 3.1 docker运行服务 前言 上一篇讲到微服务要灵活伸缩…

10.文件上传

Spring MVC 为 文 件 上 传 提 供 了 直 接 的 支 持 &#xff0c; 这 种 支 持 是 通 过 即 插 即 用 的MultipartResolver 实现的。 Spring 用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类&#xff1a;CommonsMultipartResolver Spring MVC 上下文中…

什么是活动的DWDM网络?

DWDM系统被认为是一个基于应答器的系统&#xff0c;可以帮助在数据中心互连设置中在站点之间传输大量数据。不同于无源DWDM网络&#xff0c; DWDM网络通常包括OEO、主动DWDM Mux Demux、EDFA、DCM和其他主动WDM组件&#xff0c;更适合远程传输。此外&#xff0c;主动DWDM网络还…

小美的蛋糕切割(美团2024届秋招笔试第一场编程真题)

题目分析&#xff1a;切蛋糕问题切记可以横着切&#xff0c;也可以竖着切。本题目需要快速求得两个矩形的和&#xff0c;可以用二维前缀和数组解决。然后枚举一刀切的位置。 #include <iostream> #include <algorithm> using namespace std; int a[1005][1005]; l…

投稿《证券期货业-测试技术与质量管理》的文章发表了

前一段时间给《证券期货业-测试技术与质量管理》季刊投稿的文章在第32期发表了&#xff0c;题目是《大数据背景下基于信息熵增益率的数据生成》 第一次给行业内专业的机构投稿&#xff0c;过程也算是比较辛苦&#xff0c;已经很少这么正式的编写一篇文章了&#xff0c;经过三轮…

C#封装服务

C#封装服务 新建服务项目&#xff1b;重构 OnStart 和 OnStop using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using S…

针对远程40G网络的DWDM解决方案

目前&#xff0c;用户和企业积累的数据量非常巨大&#xff0c;并在不断增长。因此&#xff0c;存储和访问这些数据也变得更加苛刻&#xff0c;需要更高的数据容量和更长距离的数据传输。我们的一个客户正在考虑为现有的40G网络添加DWDM系统&#xff0c;作为一种更严肃的未来技术…

市域治理一体化综合指挥平台解决方案:PPT全文42页,附下载

关键词&#xff1a;市域社会治理&#xff0c;智慧网格&#xff0c;市域社会治理现代化&#xff0c;智慧网格综合管理平台&#xff0c;市域治理 一、市域治理&#xff08;智慧网格&#xff09;一体化建设需求分析 1、职能部门需求&#xff1a;职能部门在市域治理中发挥着主导作…