Java 函数接口Supplier【供给型接口】简介与示例

Java中四个重要的函数式接口:Function、Predicate、Consumer和Supplier。这些接口是函数式编程的基础,Function用于转换操作,Predicate用于进行条件判断,Consumer用于消费输入而不产生输出,而Supplier则用于提供值但不接受参数。本文重点介绍Supplier接口。

供应商接口(Supplier Interface)是 Java 8 引入的 java.util.function 包的一部分,用于在 Java 中实现函数式编程。

一、 函数接口Supplier简介
Supplier 是一个泛型的函数接口,无参数(该函数不接收任何参数),返回值类型为泛型 T,是返回结果的数据类型。Supplier 的使用比较简单,使用场景也比较单一。

Supplier 函数接口在 Java 8 中定义,其源代码如下:

package java.util.function;@FunctionalInterfacepublic interface Supplier<T> {T get();}

Supplier 由于没有参数输入,所以多用于对象创建,类似于一个对象创建工厂。可以使用 Lambda 方式创建任意对象,也可以使用对象构造器的方法引用创建对象。

        //定义一个日期时间的供应者创建工厂,Lambda表达式创建供应商实例Supplier < LocalDateTime > supplier = () -> LocalDateTime.now();System.out.println(supplier.get());//定义一个日期时间的供应者创建工厂,方法调用创建供应商实例Supplier<LocalDateTime> supplierDate = LocalDateTime::now;System.out.println(supplierDate.get());

二、函数接口Supplier应用示例:

  • 应用示例(一)

先定义一个实体类:

package function;
public class Product {private int id;private String name;private float price;public Product(int id, String name, float price) {super();this.id = id;this.name = name;this.price = price;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}@Overridepublic String toString() {return "产品 [id=" + id + ", 品名=" + name + ", 单价=" + price + "]";}
}

测试主控类的代码:

package function;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.Supplier;
public class SupplierDemo {private static Supplier<List< Product >> productSupplier() {Supplier < List < Product >> supplierList = () -> {List< Product > productList = new ArrayList<>();productList.add(new Product(1, "娃哈哈纯净水", 2));productList.add(new Product(2, "比亚迪汽车", 160000f));productList.add(new Product(3, "白象方便面", 3f));productList.add(new Product(4, "南方黑芝麻糊", 3f));productList.add(new Product(5, "华为手机", 6000f));return productList;};return supplierList;}public static void main(String[] args) throws Exception {/***匿名内部类创建供应商实例***/Supplier<String> dateTimeSupplier = new Supplier<String>() {@Overridepublic String get() {LocalDateTime localDateTime = LocalDateTime.now();DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");return localDateTime.format(pattern);}};System.out.println("日期时间Supplier测试,开始:");System.out.println("第一次时间:" + dateTimeSupplier.get());Thread.sleep(1000L);System.out.println("第二次时间:" + dateTimeSupplier.get());//Lambda表达式创建随机整型数供应商实例Supplier<Integer> supplierRdm = () -> new Random().nextInt(10);System.out.println(supplierRdm.get());System.out.println(supplierRdm.get());//供应商工厂演示Supplier < List < Product >> supplier2 = SupplierDemo.productSupplier();List< Product > list = supplier2.get();list.forEach(System.out::println);}
}

测试结果图:
在这里插入图片描述

  • 应用示例(二)

supplier在工厂模式中的应用:
先定义一个实体类

package function;
public class Dog {private final String name;private  Integer age=2;public Dog(String name) {this.name = name;}public Dog(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "宠物狗 {" + "昵称='" + name  + "', 年龄=" + age + '}';}
}

测试主控程序类:

package function;
import java.util.function.Supplier;
public class SupplierTest {/***定义一个供应者的工厂类***/public static Dog dogFactory(Supplier<? extends Dog> supplier) {Dog dog = supplier.get();return dog;}public static void main(String[] args) {Dog dog1 = dogFactory(() -> new Dog("哈士奇"));Dog dog2 = dogFactory(() -> new Dog("牧羊犬",3));Dog dog3 = dogFactory(() -> new Dog("泰迪",1));System.out.println(dog1);System.out.println(dog2);System.out.println(dog3);}
}

例程测试效果图:
在这里插入图片描述

三、 Supplier 扩展类

在 Java 8 的类库中,为了方便 Supplier 的使用,提供了基本数据类型的专用 Supplier,例如 BooleanSupplier, DoubleSupplier, IntSupplier, LongSupplier。

下面是一个LongSupplier使用示例:

package function;
import java.time.LocalDateTime;
import java.time.temporal.ChronoField;
import java.util.function.LongSupplier;public class LongSupplierDemo {public static void main(String[] args) throws Exception {LongSupplier supplier = new LongSupplier() {@Overridepublic long getAsLong() {LocalDateTime dateTime = LocalDateTime.now();return dateTime.getLong(ChronoField.SECOND_OF_DAY);}};for (int i = 0; i < 3; i++) {System.out.println("第"+(i+1)+"次:" + supplier.getAsLong());Thread.sleep(1000L);}}}

测试结果(这个结果是变化的):
在这里插入图片描述

参考文献:

  • Java 8 Supplier 函数接口
  • Java 8 Supplier函数式接口介绍及代码样例

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

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

相关文章

线程与进程的区别(面试)

一.进程 进程&#xff1a;一个程序启动起来&#xff0c;就会对应一个进程&#xff0c;进程就是系统分配资源的基本单位。 上面一部分进程是我们自己去执行应用的可执行文件, 而另一部分是操作系统自动启动的进程. 二.线程 线程&#xff1a;线程是进程中的一个执行单元&#xff…

VMware调整窗口为可以缩小但不改变显示内容的大小

也就是缩小窗口不会影响内容的大小 这样设置就好

OpenAI 发布了新的事实性基准——SimpleQA

SimpleQA 简介 名为 SimpleQA 的事实性基准&#xff0c;用于衡量语言模型回答简短的事实性问题的能力。 人工智能领域的一个悬而未决的问题是如何训练模型&#xff0c;使其产生符合事实的回答。 目前的语言模型有时会产生错误的输出或没有证据证明的答案&#xff0c;这个问题…

酒店民宿小程序,探索行业数字化管理发展

在数字化发展时代&#xff0c;各行各业都开始向数字化转型发展&#xff0c;酒店民宿作为热门行业也逐渐趋向数字、智能化发展。 对于酒店民宿来说&#xff0c;如何将酒店特色服务优势等更加快速运营推广是重中之重。酒店民宿小程序作为一款集结预约、房源管理、客户订单管理等…

[C++11] 可变参数模板

文章目录 基本语法及原理可变参数模板的基本语法参数包的两种类型可变参数模板的定义 sizeof... 运算符可变参数模板的实例化原理可变参数模板的意义 包扩展包扩展的基本概念包扩展的实现原理编译器如何展开参数包包扩展的高级应用 emplace 系列接口emplace_back 和 emplace 的…

使用Ubuntu快速部署MinIO对象存储

想拥有自己的私有云存储&#xff0c;安全可靠又高效&#xff1f;MinIO是你的理想选择&#xff01;这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO&#xff0c;并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手&#xff0c;也能轻松完成&#xf…

贝尔不等式,路径积分与AB(Aharonov-Bohm)效应

贝尔不等式、路径积分与Aharonov-Bohm&#xff08;AB&#xff09;效应 这些概念分别源于量子力学不同的理论分支和思想实验&#xff0c;但它们都揭示了量子力学的奇异性质&#xff0c;包括非局域性、相位效应和波粒二象性。以下详细解析每一概念&#xff0c;并探讨其相互联系。…

用友U8接口-isHasCounterSignPiid错误

错误消息 调用U813的审批流方法报错&#xff0c;找不到方法:“Boolean UFIDA.U8.Audit.BusinessService.ManualAudit.isHasCounterSignPiid System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.MissingMethodException: 找不到方法:“Boolean…

QJson-趟过的各种坑(先坑后用法)

QJson-趟过的各种坑【先坑后用法】 Chapter1 QJson-趟过的各种坑【先坑后用法】一、不能处理大数据量&#xff0c;如果你的数据量有百兆左右(特别是有的小伙伴还喜欢json格式化输出的)&#xff0c;不要用Qjson&#xff0c;否则会报错 DocumentTooLarge二、json格式化输出1.构建…

flink实战-- flink任务的火焰图如何使用

火焰图 Flame Graphs 是一种有效的可视化工具,可以帮助我们排查如下问题: 目前哪些方法正在消耗 CPU 资源?一个方法的消耗与其他方法相比如何?哪一系列的堆栈调用导致了特定方法的执行?y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的…

.Net Core 6.0 WebApi在Centos中部署

查看已经开发的端口的列表 firewall-cmd --zonepublic --list-ports .net core sdk密匙 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum update .net core sdk安装 sudo yum install -y dotnet-sdk-6.0 sudo dnf in…

Java基于SpringBoot+Vue的农产品电商平台

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Java基于SpringBoot 的农产品电商平台。该系统采用 Java 语言 开发&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大学生实战项目参考使用。 博主介绍&#xff…

一文读懂系列:结合抓包分析,详解SSH协议通信原理

SSH协议通过建立加密通道来提供安全的远程访问、文件传输和执行远程命令等操作。接下来我们就通过具体示例和抓包分析&#xff0c;让大家清楚地了解SSH协议的神秘面纱&#xff01;如有更多疑问&#xff0c;欢迎讨论区留言讨论~ 1. SSH简介 SSH&#xff08;Secure Shell&#x…

数据冒险-ld和add(又称load-use冒险)

第一张图没有使用前递&#xff0c;第二张图使用前递&#xff0c;chatgpt分析第二张图 这张图展示了一个流水线的执行过程&#xff0c;其中存在读后写&#xff08;RAW&#xff09;数据冒险。我们可以通过**前递&#xff08;Forwarding&#xff09;**技术来解决这个数据冒险&…

Java 的 Scanner 类:控制台输入与文件扫描

Java 的 Scanner 类是一个非常方便的工具类&#xff0c;主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容&#xff0c;但我们通常更喜欢它用于控制台输入&#xff0c;因为扫描文件可以通过文件流来完成。接下来&#xff0c;我们将通过几个简单的示例来讲解…

安卓市场如何做APP的分发、推广?

今天主要跟大家分享一些分发、推广这块操作的内容以及对安卓用户的一些理解。 分发的日常生活&#xff1a;“某渠道怎样怎样&#xff0c;应用宝是不是要加点预算&#xff0c;OPPO是不是要加点预算&#xff0c;你的成本又高了&#xff0c;华为又掉注册&#xff0c;应用宝又掉注册…

基于JavaWeb的图书售卖网站(源码+部署+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于JavaWeb的图书售卖网…

高级 <HarmonyOS主题课>构建华为支付服务的课后习题

五色令人目盲&#xff1b; 五音令人耳聋&#xff1b; 五味令人口爽&#xff1b; 驰骋畋猎&#xff0c;令人心发狂&#xff1b; 难得之货&#xff0c;令人行妨&#xff1b; 是以圣人为腹不为目&#xff0c;故去彼取此。 本篇内容主要来自&#xff1a;<HarmonyOS主题课>构建…

python全栈开发《63.判断两个集合中是否有相同的元素》

目录 1.isdisjoint的功能2.isdisjoint的用法3.代码 1.isdisjoint的功能 判断两个集合是否包含相同的元素。如果没有&#xff0c;返回True&#xff1b;如果有&#xff0c;返回False。 2.isdisjoint的用法 a_set {name,xiaomu,xiaoming} b_set {xiaoming,xiaogang,xiaohong} re…

员工管理系统(python)

利用python的自定义函数以及循环函数写一个小的员工管理系统&#xff0c;以下是详细代码&#xff1a; # 定义一个空的员工列表&#xff0c;用于存储员工信息 list_ems []# 添加员工的函数 def add():# 提示用户输入员工的各项信息employee_id input("请输入员工的工号&…