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

news2024/11/17 8:25:10

文章目录

  • 一、使用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调用的函数方法;

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

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

相关文章

centos7上升级mysql8.0.21到mysql8.0.35版本

1、下载安装包 cd /home/soft/mysql8.0.35 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.35-1.el7.x86_64.rpm-bundle.tar 2、解压压缩包 3、停止掉mysqld服务 systemctl stop mysqld 4、强制安装新的版本包 rpm -ivh mysql-community-common-8.0.35-1.el…

富士康注资21亿元河南成立电动车公司 | 百能云芯

富士康在河南注册成立富士康新能源汽车产业发展有限公司&#xff0c;注册资本达人民币5亿元&#xff0c;展现了其在电动车产业的持续布局。这一全资子公司将致力于从事汽车零部件及配件制造、电机制造、新材料技术研发、新能源汽车整车销售等业务。作为鸿海集团的全资子公司&am…

基于Jackson封装的JSON、Properties、XML、YAML 相互转换的通用方法

文章目录 一、概述二、思路三、实现四、测试 一、概述 我们在 yaml转换成JSON、MAP、Properties 通过引入 实现了JSON、Properties、XML、YAML文件的相互转换&#xff0c;具体封装的类、方法如下&#xff1a; 上面的实现&#xff0c;定义了多个类、多个方法&#xff0c;使用…

FlinkAPI开发之数据合流

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以…

关于程序员技术方面的一些思考

公司用的技术栈是 SpringBootVue&#xff0c;刚开始让我做的是后端开发&#xff0c;对一些简单的页面的 CRUD 进行开发。因为在学校自学的是 Java&#xff0c;而研发部门里面后端比较多&#xff0c;所以后端的活不缺人&#xff0c;领导建议我学学 Vue&#xff0c;分担一下前端的…

iOS 应用上架指南:资料填写及提交审核

摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南&#xff0c;您将了解到如何填写正确的资料&#xff0c;并顺利通过苹果公司的审核。 引言 在开发iOS应用后&#xff0c;将其…

Pytorch从零开始实战16

Pytorch从零开始实战——ResNeXt-50算法的思考 本系列来源于365天深度学习训练营 原作者K同学 对于上次ResNeXt-50算法&#xff0c;我们同样有基于TensorFlow的实现。具体代码如下。 引入头文件 import numpy as np from tensorflow.keras.preprocessing.image import Ima…

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

LaunchPad 是代币面向市场的重要一环&#xff0c;将代币推向市场&#xff0c;加密项目将能够通过代币的销售从市场上募集资金&#xff0c;同时生态也开始进入全新的发展阶段。而对于投资者来说&#xff0c;早期打新市场同样充满着机会&#xff0c;参与 LaunchPad 对于每一个投资…

通过iFrame嵌入Grafana页面或pannel

前言 在当前数据驱动的时代&#xff0c;有效地可视化和监控关键性能指标变得至关重要。Grafana&#xff0c;作为一个开源的监控解决方案&#xff0c;提供了强大的功能来呈现和分析数据&#xff0c;从而帮助用户及时洞察和响应各种情况。随着技术的不断发展&#xff0c;将这些信…

TOWE 65W智能快充插线板为家庭用电保驾护航

随着家用电器在人们生活中的普及&#xff0c;在给人们带来便利的同时&#xff0c;其安全性也日益引起人们的重视。延长线插座作为固定插座的补充&#xff0c;因其可移动、携带方便、灵活性强而成为家居和办公中不可或缺的用品。一般普通的塑料插排插座受额定电流和额定功率的影…

Unity 了解Input Manage下默认的输入轴

在Unity菜单Edit->Project Settings->Input Manager->Axes下有一些默认的输入轴&#xff0c;如 这些输入轴代表不同类型的输入&#xff0c;其中&#xff1a; Horizontal&#xff1a;水平移动输入轴。通常与键盘的左右箭头键、A和D键、游戏手柄的左摇杆水平轴等相关联…

经典目标检测YOLO系列(二)YOLOv2算法详解

经典目标检测YOLO系列(二)YOLOv2算法详解 YOLO-V1以完全端到端的模式实现达到实时水平的目标检测。但是&#xff0c;YOLO-V1为追求速度而牺牲了部分检测精度&#xff0c;在检测速度广受赞誉的同时&#xff0c;其检测精度也饱受诟病。正是由于这个原因&#xff0c;YOLO团队在20…

从零学Java 集合概述

Java 集合概述 文章目录 Java 集合概述1 什么是集合?2 Collection体系集合2.1 Collection父接口2.1.1 常用方法2.1.2 Iterator 接口 1 什么是集合? 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进行操作的常用方法&#xff1b;可实现数组的功能。 和数组区别&…

基于深度学习的果蔬检测识别系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov5 yolov5主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM、CA等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主…

Python如何使用Excel文件

使用Python操作Office——EXCEL 首先介绍下office win32 com接口&#xff0c;这个是MS为自动化提供的操作接口&#xff0c;比如我们打开一个EXCEL文档&#xff0c;就可以在里面编辑VB脚本&#xff0c;实现我们自己的效果。对于这种一本万利的买卖&#xff0c;Python怎么能放过…

VLAN原理与配置

0x00 前言 本节主要记录VLAN相关的内容。 传统以太网的缺点 广播域越大&#xff0c;产生的网络安全问题&#xff0c;垃圾流量问题越严重。 什么是VLAN&#xff1f; Virtual Local Area NetWork 虚拟局域网技术。 VLAN的特点是什么 一个VLAN就是一个广播域&#xff0c;在…

web前端案例之抽奖

使用HTMLJavascript完成抽奖案例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}</style></head><body><div id"container" onclic…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷5

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

设计与实现基于Java+MySQL的模拟银行ATM操作系统

课题背景 随着现代经济的发展&#xff0c;电子支付和自动化银行服务已成为人们生活中不可或缺的一部分。自动取款机&#xff08;ATM&#xff09;作为一种常见的自助服务设备&#xff0c;使用户能够方便地进行资金的存取、查询余额、转账等操作&#xff0c;而无需到银行柜台。 …

动态内存管理的题目

数组串联 在leetcode上找的一题 &#xff1a; 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i…