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();

    // 实现方法,默认返回1
    default int add(){return 1;}
}

class SumTestImpl implements SumTest {

    @Override
    public 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() {
            @Override
            public 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调用的函数方法;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm运动会管理系统的设计与实现 【附源码】

基于ssm运动会管理系统的设计与实现 【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuil…

C2-3.3.2 机器学习/深度学习——数据增强

C2-3.3.2 数据增强 参考链接 1、为什么要使用数据增强&#xff1f; ※总结最经典的一句话&#xff1a;希望模型学习的更稳健 当数据量不足时候&#xff1a; 人工智能三要素之一为数据&#xff0c;但获取大量数据成本高&#xff0c;但数据又是提高模型精度和泛化效果的重要因…

工业智能网关:HiWoo Box远程采集设备数据

工业智能网关&#xff1a;HiWoo Box远程采集设备数据 在工业4.0和智能制造的浪潮下&#xff0c;工业互联网已成为推动产业升级、提升生产效率的关键。而在这其中&#xff0c;工业智能网关扮演着至关重要的角色。今天&#xff0c;我们就来深入探讨一下工业智能网关。 一、什么…

Apache JMeter 5.5: 新手指南

如何获取并运行 JMeter 首先&#xff0c;要使用 JMeter&#xff0c;你需要从官网获取软件包。前往 Apache JMeter 的官方页面&#xff0c;然后下载所 需的压缩文件。 配置和启动 JMeter 获取了 JMeter 后&#xff0c;由于它是无需安装即可使用的工具&#xff0c;直接解压下载…

申请企业通配符SSL证书流程

通配符SSL证书&#xff0c;又叫泛域名SSL证书&#xff0c;可以用一张SSL证书同时保护主域名以及主域名下的所有子域名。按照验证方式可以将通配符SSL证书分为DV通配符SSL证书和OV通配符SSL证书。其中OV通配符SSL证书只支持企事业单位申请&#xff0c;又称之为OV企业型通配符SSL…

贝蒂详解<string.h>(下)

✨✨欢迎大家来到贝蒂大讲堂✨✨ ​​​​&#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 目录 1. 简介 2. memset()函数 2.1用法 2.2实例 2.3 实现me…

快速了解云计算与云原生

快速了解云计算与云原生 云计算云原生DevOps容器持续交付微服务 云计算 在讲云原生之前&#xff0c;先来讲讲云计算 其中云原生属于技术架构理念&#xff0c;而云计算提供应用所需的基础资源&#xff0c;云计算是云原生的基础&#xff0c;两者是相辅相成的 云计算简单来说&a…

竞赛保研 基于深度学习的水果识别 设计 开题 技术

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…

JVM基础(3)——JVM垃圾回收机制

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

复合机器人作为一种新型的智能制造装备高效、精准和灵活的生产方式

随着汽车制造业的快速发展&#xff0c;对于高效、精准和灵活的生产方式需求日益增强。复合机器人作为一种新型的智能制造装备&#xff0c;以其独特的优势在汽车制造中发挥着越来越重要的作用。因此&#xff0c;富唯智能顺应时代的发展趋势&#xff0c;研发出了ICR系列的复合机器…

计算机毕业设计 | SpringBoot航空订票 机票预定购买系统(附源码)

1&#xff0c; 概述 1.1 选题目的 目前&#xff0c;国内航空公司的数量和规模都在扩大&#xff0c;国外航空公司也纷纷着陆中国&#xff0c;这些航空公司之间的竞争可谓日益激烈。配备一个安全、高效、灵活、可靠的客户服务中心系统对于航空公司加强客户服务质量&#xff0c;…

使用Android Compose实现网格列表滑到底部的提示信息展示

文章目录 概述1 效果对比1.1 使用添加Item的办法&#xff1a;1.2 使用自定义的方法 2. 效果实现2.1 列表为空时的提示页面实现2.2 添加Item的方式代码实现2.3 使用自定义的方式实现 3. UI工具类 概述 目前大多数的APP都会使用列表的方式来呈现内容&#xff0c;例如淘宝&#x…

解决Echarts y轴文本超出容器问题

解决Echarts y轴文本超出容器问题 一开始好好的 数据变多之后就被挤出去了 解决方法&#xff1a; // echarts的grid属性 主要就是containLabel这个属性的配置 不设置的话他默认是false, 主要是包含是否包含刻度标签grid: {left: "5%",right: "10%",botto…

linux 里面在docker 里面安装pg 数据库(亲测有效)

目录 1 上传 1 上传 上传之后tar 包&#xff0c;将他变成镜像 输入docker images,发现目前是没有镜像的&#xff0c;现在将tar 包变成镜像 docker load -i postgresql.tar以上就将tar 包变成镜像了 现在在宿主机找一个地方&#xff0c;存放数据库的数据 /home/softinstall/…

全网独家:基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机极简版数据库容器

本文尝试基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机版极简版数据库容器。 一、软件包源 1、openEuler-20.03-LTS容器底包 openEuler-20.03-LTS-SP4 下载链接 sha256:24d8f51c1f3a79eb975c4e498cadd9055bfd708d66c15935ec46664d0f975a7b openEuler-dock…

@DependsOn:解析 Spring 中的依赖关系之艺术

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 DependsOn&#xff1a;解析 Spring 中的依赖关系之艺术 前言简介基础用法高级用法在 XML 配置中使用 DependsOn通过 Java Config 配置实现依赖管理 生命周期与初始化顺序Bean 生命周期的关键阶段&…

高照数量关系(一)—— 倍数特性、方程问题、周期问题

倍数特性 整除型 &#xff08;1&#xff09;口诀法&#xff1a;&#xff08;常用于3、4、5、9&#xff09;3/9看各个位数字之和&#xff0c;5看末位&#xff0c;4看末两位。 3/9 -> 看各位数字之和能否被3/9整除&#xff0c;例&#xff1a;124345 2/5 ->看数字末一位能…

【Linux】进程

----------------| 本文目录 |---------------- 1. 进程1.1 基本概念1.2 描述进程 - PCB1.2.1 task_struct - PCB的一种1.2.2 task_struct 内容分类 1.3 组织进程1.4 查看进程1.5 通过系统调用获取进程标示符1.6 通过系统调用创建进程 - fork初识 2. 进程状态2.1 看看Linux内核…

美创科技第59号安全实验室最新力作!《内网渗透实战攻略》出版发行

总结先进攻防实战经验&#xff0c;基于创新入侵生命周期模型&#xff0c;为提升渗透实战能力提供系统操作教程&#xff01;近期&#xff0c;美创科技创始人&CEO柳遵梁&#xff0c;美创第59号安全实验室&#xff08;王月兵、覃锦端、毛菲、刘聪等&#xff09;撰写的新书《内…

时空序列问题的本质和底层逻辑

本质&#xff1a;Still need to polish this. 底层逻辑&#xff1a;Still need to polish this.See you pretty soon. Reference 【时空序列预测】什么是时空序列问题&#xff1f;这类问题主要应用了哪些模型&#xff1f;主要应用在哪些领域&#xff1f;_mb62b92582e5a0a的技…