Java 中的 Supplier:让数据生成更灵活

文章目录

        • 1. Supplier 基础:无参返回,懒加载的利器
        • 2. 与 Optional 配合,优雅地处理默认值
        • 3. 惰性初始化缓存:提升性能
        • 4. 用于随机数、时间戳等动态数据的生成
        • 5. 结合 Stream 实现动态数据流
        • 6. 与工厂模式结合,动态创建对象
        • 7. Supplier 与依赖注入结合,简化依赖管理
        • 8. 自定义 Supplier,简化业务逻辑
        • 总结:
        • 推荐阅读文章

Supplier<T> 是 Java 中一个简单但功能强大的函数式接口,用于不接受任何参数却返回结果的场景。Supplier 的妙用在于它能够灵活地生成、提供数据或对象,尤其适合懒加载、随机生成、缓存等需求。今天,我们来探讨 Supplier 的应用技巧。

1. Supplier 基础:无参返回,懒加载的利器

Supplier 的核心特点是延迟计算——它不接收参数,只有在调用 get() 时才生成数据。这种特性在懒加载场景下非常有用。例如,我们希望在需要时才加载复杂对象:

Supplier<ExpensiveObject> objectSupplier = () -> new ExpensiveObject();
ExpensiveObject obj = objectSupplier.get(); // 仅在调用 get() 时创建

这种延迟加载机制避免了不必要的开销,提升了性能。

2. 与 Optional 配合,优雅地处理默认值

在实际开发中,我们经常需要为 null 值提供默认处理。OptionalorElseGet 方法允许我们传入一个 Supplier 作为默认值生成器:

Optional<String> optionalName = Optional.ofNullable(null);
String name = optionalName.orElseGet(() -> "Default Name");

与直接使用 orElse 相比,orElseGet 只有在值不存在时才会执行 Supplier,提高了代码的性能和效率。

3. 惰性初始化缓存:提升性能

在高频调用中,通过 Supplier 实现惰性初始化缓存可以显著减少不必要的计算。假设我们要频繁获取某个对象但只需初始化一次,可以使用 SupplierOptional 实现:

public class Cache {
    private Supplier<Data> dataSupplier = this::loadData;

    private Data loadData() {
        System.out.println("Loading data...");
        return new Data("Cached data");
    }

    public Data getData() {
        return dataSupplier.get();
    }
}

这样 loadData() 只会在第一次调用 getData() 时执行,之后的数据将从缓存中直接读取,避免重复计算。

4. 用于随机数、时间戳等动态数据的生成

Supplier 特别适合动态生成不确定的值,比如随机数、时间戳等:

Supplier<Double> randomValue = Math::random;
System.out.println("Random Value: " + randomValue.get());

通过 Supplier,每次调用 get() 都能生成不同的随机数,为程序增加了灵活性。

5. 结合 Stream 实现动态数据流

Supplier 可以与 Stream.generate() 结合,生成无限数据流,适合需要动态生成数据的场景。例如,生成一组随机数或计算斐波那契数列:

Stream.generate(Math::random)
      .limit(5)
      .forEach(System.out::println); // 生成 5 个随机数

这种方式不仅简洁,还避免了创建重复逻辑的麻烦,方便生成大量数据流。

6. 与工厂模式结合,动态创建对象

Supplier 常用于工厂模式的实现。假设我们有一个接口 Animal 和多个实现类,我们可以用 Supplier 创建动态工厂:

Map<String, Supplier<Animal>> animalFactories = Map.of(
    "dog", Dog::new,
    "cat", Cat::new
);

Animal dog = animalFactories.get("dog").get();

通过 Supplier 配合工厂模式,我们可以轻松根据输入动态创建不同的对象,而不必频繁使用 if-else 逻辑。

7. Supplier 与依赖注入结合,简化依赖管理

在依赖注入中,Supplier 也能扮演重要角色。在需要延迟初始化依赖的场景下,可以通过 Supplier 实现懒加载,避免提前初始化带来的性能开销:

public class Service {
    private final Supplier<DatabaseConnection> connectionSupplier;

    public Service(Supplier<DatabaseConnection> connectionSupplier) {
        this.connectionSupplier = connectionSupplier;
    }

    public void processData() {
        DatabaseConnection conn = connectionSupplier.get();
        // 使用 conn 处理数据
    }
}

这样,Service 在真正需要数据库连接时才会获取连接,有效控制资源使用。

8. 自定义 Supplier,简化业务逻辑

假设在电商系统中,我们需要根据不同的用户生成不同的优惠券。我们可以使用 Supplier 自定义不同的生成逻辑:

public static void generateCoupon(User user, Supplier<Coupon> couponSupplier) {
    Coupon coupon = couponSupplier.get();
    System.out.println("Generated coupon for " + user.getName() + ": " + coupon);
}

使用时,只需定义不同的 Supplier 逻辑:

Supplier<Coupon> newUserCoupon = () -> new Coupon("NEWUSER10", 10);
generateCoupon(user, newUserCoupon);

这种方式让代码结构清晰,并根据不同需求定制生成逻辑。

总结:

Supplier 是 Java 函数式接口中非常灵活、简洁的一员,它不仅仅用于数据的懒加载,还可以用于生成动态数据流、依赖管理、工厂模式等场景。通过灵活应用 Supplier,可以大幅简化代码逻辑、提升性能,开发更加智能、易维护的程序。希望以上这些应用技巧能帮助你更好地使用 Supplier

推荐阅读文章
  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
  • HTTP、HTTPS、Cookie 和 Session 之间的关系
  • 什么是 Cookie?简单介绍与使用方法
  • 什么是 Session?如何应用?
  • 使用 Spring 框架构建 MVC 应用程序:初学者教程
  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
  • 如何理解应用 Java 多线程与并发编程?
  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽
  • Java Spring 中常用的 @PostConstruct 注解使用总结
  • 如何理解线程安全这个概念?
  • 理解 Java 桥接方法
  • Spring 整合嵌入式 Tomcat 容器
  • Tomcat 如何加载 SpringMVC 组件
  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”
  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
  • 线程 vs 虚拟线程:深入理解及区别
  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
  • Java 中消除 If-else 技巧总结
  • 线程池的核心参数配置(仅供参考)
  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)
  • Java 枚举的几个常用技巧,你可以试着用用

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

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

相关文章

ARM死机(HardFault)调试技巧详解(栈回溯,不破坏现场)

目录 Keil调试技巧&#xff1a; 一.不破坏现场连接仿真器与进入debug 二.栈回溯 死机调试示例 J-Link调试方法 示例&#xff1a;空指针异常 不能连接烧录器或者读取内存怎么办&#xff1f; 在日常开发中&#xff0c;经常会遇到单片机卡死机等问题&#xff0c;经常很难定…

nodejs 020: React语法规则 props和state

props和state 在 React 中&#xff0c;props 和 state 是管理数据流的两种核心机制。理解它们之间的区别和用途是构建 React 应用程序的基础。 一、props 和 state的区别 特性propsstate定义方式由父组件传递给子组件的数据组件内部管理的本地数据是否可修改不可变&#xff…

【开源免费】基于SpringBoot+Vue.JS水果购物网站(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 065 &#xff0c;文末自助获取源码 \color{red}{T065&#xff0c;文末自助获取源码} T065&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

python可视化进阶

引用&#xff1a; 首先需要安装 plotnine from plotnine import* import joypy数据可视化进阶操作 3.1 类别数据可视化 【例3-1】——绘制简单条形图 【代码框3-1】——绘制简单条形图 # 图3-1的绘制代码 import pandas as pd import matplotlib.pyplot as plt from cvxpy …

大模型入门自学资源汇总,很难找到比这还全的大模型学习资源总结了!

接触各种AI工具到现在也快两年了&#xff0c;今年和同学陆续做了一些AI应用的科普宣讲&#xff0c;在这过程中收集了不少自学资源&#xff0c;特地挑出一部分整理成以下的内容。 书籍 大模型应用开发极简入门&#xff1a;基于GPT-4和ChatGPT 首推今年年初出版的《大模型应用开…

为何选择Spring AI Alibaba开发智能客服平台?

0 前言 本文来看如何使用Spring AI Alibaba构建Agent应用。 1 需求 智能客服平台&#xff0c;可帮助用户完成机票预定、问题解答、机票改签、取消等动作&#xff0c;具体要求&#xff1a; 基于 AI 大模型与用户对话&#xff0c;理解用户自然语言表达的需求支持多轮连续对话…

Python学习从0到1 day27 第三阶段 Spark ② 数据计算Ⅰ

人总是会执着于失去的&#xff0c;而又不珍惜现在所拥有的 —— 24.11.9 一、map方法 PySpark的数据计算&#xff0c;都是基于RDD对象来进行的&#xff0c;采用依赖进行&#xff0c;RDD对象内置丰富的成员方法&#xff08;算子&#xff09; map算子 功能&#xff1a;map算子…

数据结构合并两个有序链表

数据结构 1.合并两个有序数组代码&#xff1a; 1.合并两个有序数组 这里我们可以创建一个新的对象作为合并后的新链表newHead&#xff0c;而NewHead.next就是我们要返回的头部的位置 在创建一个对象来获取nextHead.next下一个节点来作为我们新链表的起始位置防止我们的头部位置…

动态规划 —— dp 问题-买卖股票的最佳时机含手续费

1. 买卖股票的最佳时机含手续费 题目链接&#xff1a; 714. 买卖股票的最佳时机含手续费 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/ 2. 算法原理 状态表示&#xff1a;以某一个…

利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印

现在很多场合需要将PDF或图片加水印&#xff0c;本程序利用pythonstudio编写。 第一步 界面 其中&#xff1a; LstMask:列表框 PopupMenu:PmnMark LstFiles:列表框 PopupMenu:PmnFiles OdFiles:文件选择器 Filter:PDF文件(.PDF)|.PDF|图像文件(.JPG)|.JPG|图像文件(.png…

基于python深度学习技术矩阵分解的推荐系统,通过学习隐含特征,实现推荐

实现了一个基于矩阵分解的推荐系统&#xff0c;用于预测用户对电影的评分。具体来说&#xff0c;该程序通过TensorFlow构建和训练一个模型&#xff0c;来学习用户和电影之间的隐含特征&#xff0c;并根据这些特征预测评分。以下是代码的主要功能和步骤的详细描述&#xff1a; …

[vulnhub] DarkHole: 1

https://www.vulnhub.com/entry/darkhole-1,724/ 端口扫描主机发现 探测存活主机&#xff0c;184是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 09:59 CST Nmap scan report for 192.168.75.1 Host is up (0.00027s latency). MA…

4.1 WINDOWS XP,ReactOS对象与对象目录----1

系列文章目录 文章目录 系列文章目录4.1 对象与对象目录OBJECT_HEADERObpLookupEntryDirectory()NtCreateTimer() 4.1 对象与对象目录 “对象(Object)”这个词现在大家都已耳熟能详了&#xff0c;但是对象到底是什么呢?广义地说&#xff0c;对象就是“目标”&#xff0c;行为…

STM32H503开发(2)----STM32CubeProgrammer烧录

STM32H503开发----2.STM32CubeProgrammer烧录 概述硬件准备视频教学样品申请源码下载参考程序自举模式BOOT0设置UART烧录USB烧录 概述 STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工具。 它提供了一个易用高效的环境&#xff0c;通过…

“双十一”电商狂欢进行时,在AI的加持下看网易云信IM、RTC如何助力商家!

作为一年一度的消费盛会&#xff0c;2024年“双十一”购物狂欢节早已拉开帷幕。蹲守直播间、在主播热情介绍中点开链接并加购&#xff0c;也已成为大多数人打开“双11”的重要方式。然而&#xff0c;在这火热的购物氛围背后&#xff0c;主播频频“翻车”、优质主播稀缺、客服响…

debian系统安装qt的时候 显示xcb相关文件缺失

如果是安装之后的问题 我们可以选择使用ldd的命令查看当前依赖的so那些文件确实 ldd /home/yinsir/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so 本人在进行打包的时候 出现则会个报错 ERROR: ldd outputLine: “libxcb-util.so.1 > not found” ERROR: for binary: “/…

A023-基于SpringBoot的冷链物流系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

【数据分析】如何构建指标体系?

有哪些指标体系搭建模型&#xff1f;五个步骤教你从0开始搭建指标体系 一、企业指标体系搭建存在什么问题 许多企业在搭建数据指标体系时遇到了诸多难题&#xff0c;如问题定位不准确、数据采集不完整、目标不一致、报表无序、指标覆盖不全面以及报表价值未充分利用等。 1、…

C++20 概念与约束(1)—— SFINAE

1、从模板说起 众所周知&#xff0c;C在使用模板时&#xff0c;如果有多个模板匹配&#xff0c;则编译器会选择最匹配的一个模板进行实例化&#xff0c;这也正是模板特化和偏特化的依据。 根据上面这张图中的现象&#xff0c;列举下面几个示例&#xff1a; 1、不存在模板的情况…

基于Spring Boot的在线装修管理系统的设计与实现,LW+源码+讲解

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…