【Java 8 新特性】Java Supplier示例

news/2025/2/5 0:46:14/

Java Supplier是一个功能接口,代表结果的提供者。

Supplier的功能方法是get()

一个Supplier可以通过lambda表达式、方法引用或默认构造函数来实例化。

SupplierJava 8中被引入,属于java.util.function包。

Supplier功能接口的源代码如下。

@FunctionalInterface
public interface Supplier<T> {T get();
} 

我们可以看到在上面的代码中,Supplierget()方法,可以返回通用类型的值。

get()方法不接受任何参数,只返回通用类型的值。

我们可以按以下方式实例化Supplier

Supplier<String> s = () -> "Hello World!"; 

Java还提供了返回特定类型值的Supplier

BooleanSupplier返回Boolean数据类型,IntSupplier返回Integer数据类型,LongSupplier返回Long数据类型,DoubleSupplier返回Double数据类型值。

我们还可以根据我们的要求创建自定义的功能接口。

使用Lambda表达式实例化Supplier

我们将在这里使用lambda表达式来实例化Supplier

因为我们知道它的方法get()只返回值,不接受任何参数,所以我们的lambda表达式将有空的参数部分。

SupplierWithLambda.java

import java.util.Random;
import java.util.function.Supplier;public class SupplierWithLambda {public static void main(String[] args) {Supplier<String> s1 = () -> "Hello World!"; System.out.println(s1.get());Random random = new Random();Supplier<Integer> s2 = () -> random.nextInt(10); System.out.println(s2.get());     }
} 

输出

Hello World!
9 

使用方法引用实例化Supplier

方法引用使用(::)符号来调用方法。假设我们有一个MyUtil类和一个静态方法getFavoriteBook(),那么我们可以用类名来调用它。

MyUtil::getFavoriteBook

如果我们有非静态方法,我们可以使用类的实例来调用这个方法。

假设myUtilMyUtil类的实例,getAge()是一个非静态方法,那么我们使用实例来调用它,如下所示。

myUtil::getAge 

我们知道,Supplier功能接口的get()方法没有参数,所以我们的getFavoriteBook()getAge()方法不应该接受任何参数。

找到这个例子。

SupplierWithMethodReference.java

import java.util.Random;
import java.util.function.Supplier;public class SupplierWithMethodReference {public static void main(String[] args) {Supplier<String> s1 = MyUtil::getFavoriteBook;System.out.println(s1.get());MyUtil myUtil = new MyUtil();      Supplier<Integer> s2 = myUtil::getAge;System.out.println(s2.get());   Random random = new Random();Supplier<Integer> s3 = random::nextInt;System.out.println(s3.get());       }
}class MyUtil {private Integer age = 30;public static String getFavoriteBook(){return "Mahabharat";}public Integer getAge(){return age;}
} 

输出

Mahabharat
30
-682408931 

使用默认构造函数实例化Supplier

我们可以使用没有参数的构造函数来实例化Supplier,即默认构造函数。

找到Book类的构造函数参考。

Book::new 

找到使用默认构造函数来实例化Supplier的例子。

SupplierWithConstructorRef.java

import java.util.Random;
import java.util.function.Supplier;public class SupplierWithConstructorRef {public static void main(String[] args) {Supplier<Random> s1 = Random::new; Random random = s1.get();System.out.println(random.nextInt(10));   Supplier<Book> s2 = Book::new; Book book = s2.get();System.out.println(book.getBookName());}
}class Book {private String bookName = "Mahabharat";public String getBookName(){return bookName;}
} 

输出

9
Mahabharat 

自定义Supplier功能接口

我们可以使用@FunctionalInterface注解创建一个自定义的Supplier功能接口。

我们的Supplier不接受参数,但返回一个通用类型的值。

CustomSupplierDemo.java


import java.util.Random;@FunctionalInterface
interface MySupplier<T> {T fetch();
}public class CustomSupplierDemo {public static void main(String[] args) {//Using Lambda ExpressionMySupplier<String> s1 = () -> "Hello World!"; System.out.println(s1.fetch());//Using Method ReferenceRandom random = new Random();MySupplier<Integer> s2 = random::nextInt;System.out.println(s2.fetch());       //Using ConstructorMySupplier<Random> s3 = Random::new; Random rdm = s3.fetch();System.out.println(rdm.nextInt(10));      }
} 

输出

Hello World!
521143516
6 

BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier

Java提供了以下功能接口,用于特定数据类型的Supplier

BooleanSupplier: Supplier返回Boolean数据类型。它的方法是getAsBoolean()

IntSupplier: Supplier返回Integer数据类型。它的方法是getAsInt()

LongSupplier: Supplier返回Long数据类型。它的方法是getAsLong()

DoubleSupplier: Supplier返回Double数据类型。它的方法是getAsDouble()

下面是代码示例

SpecificDataTypeSupplier.java

import java.util.Random;
import java.util.function.BooleanSupplier;
import java.util.function.DoubleSupplier;
import java.util.function.IntSupplier;
import java.util.function.LongSupplier;public class SpecificDataTypeSupplier {public static void main(String[] args) {int age = 30;BooleanSupplier bs = () -> age > 20;System.out.println(bs.getAsBoolean());Random random = new Random();IntSupplier is = random::nextInt;System.out.println(is.getAsInt());LongSupplier ls = random::nextLong;System.out.println(ls.getAsLong());    DoubleSupplier ds = random::nextDouble;System.out.println(ds.getAsDouble());    }
} 

输出

true
-429015737
5525406112169000010
0.7553680537299522 

Java Supplier与Consumer区别

Java SupplierConsumer都是功能接口。

Supplier表示结果的提供者,该结果返回一个对象且不接受任何参数,而Consumer表示一个操作,其接受单个输入参数且不返回任何结果。

Supplier功能接口的方法。

T get() 

Consumer功能界面的方法。

void accept(T t) 

示例

SupplierConsumerDemo.java

import java.util.function.Consumer;
import java.util.function.Supplier;public class SupplierConsumerDemo {public static void main(String[] args) {Supplier<String> s = Country::getPMName;Consumer<String> c = Country::printMessage;   c.accept(s.get());}
}class Country {public static String getPMName() {return "Narendra Modi";}public static void printMessage(String msg) {System.out.println(msg);}
} 

输出

Narendra Modi 

参考文献

【1】Interface Supplier
【2】Java Functional Interface
【2】Java Supplier Example


http://www.ppmy.cn/news/1186261.html

相关文章

vue 使用openlayers导出渲染的地图

下载地图官方示例: http://openlayers.org/en/latest/examples/export-map.html http://openlayers.org/en/latest/examples/export-pdf.html 我这儿使用到了 file-saver (下载图片、附件) npm install file-saver --save import { saveAs } from file-saver; // 执行下…

科学化决策数据分析,先从量化开始

在当今信息爆炸的时代&#xff0c;数据已经成为我们生活和工作中不可或缺的一部分。在各行各业&#xff0c;人们越来越依赖数据来指导决策和优化业务。在这个背景下&#xff0c;量化成为了一种重要的方法论&#xff0c;通过收集、分析和解读数据&#xff0c;为我们提供了更准确…

项目添加EZOpenSDK之后就开始报错:could not build module foundation等

最近修改一个老项目&#xff0c;出现了一个报错问题。困扰了很久。现在终于找到解决方法了。分享一下。 正常的项目&#xff0c;使用pod引入EZOpenSDK之后就开始报错了&#xff0c;下面就是错误信息&#xff1a; could not build module foundation错误 could not build modul…

2023/10/30 JAVA学习

JAVA浮点型运算会出现精度问题 如果没break,不会立刻停止,会执行下一个语句,并且不会判断条件,执行完后break 也可以这样写定义动态数组 两个变量地址相同,指向了同一个数组对象,所以更改一个另一个也会进行更改 方法其实就是函数 OUT: 外部标签,一种神奇的方式, print是输出括…

电脑连上网线后同时连接wifi

可以尝试手动设置网络的优先级&#xff1a; 1、右击桌面右下角的网络图标&#xff0c;点击进入“打开网络和共享中心”&#xff1b;2、点击左上角的“更改适配器设置”&#xff0c;随后你就能看见你现在所连接的有线网络和无线网络了&#xff1b;3、双击其中一个网络会弹出一个…

MySQL数据库干货_09—— MySQL中的外键约束(Foreign Key)

外键约束(Foreign Key) 添加外键约束 使用DDL语句添加外键约束 ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY( 列 名 ) REFERENCES 参照的表名(参照的列名);示例一&#xff1a; 创建 departments 表包含 department_id 、department_name &#xff0c;location_id。…

0X01

打开题目 点了几下跳出一个新的页面 点击secret 在上一个页面查看源代码&#xff0c;出现action.php然后点击之后就会在地址栏里面出现end.php 抓包看看&#xff0c;出现secr3t.php huidao开始的页面&#xff0c;访问看看 这是一个PHP脚本&#xff0c;以HTML标签开头。该脚本包…

UE5 日记(人物连招:蒙太奇动画通知(含视频链接))

教程https://www.youtube.com/watch?vsWpENaVGj2M&listPLiSlOaRBfgkcPAhYpGps16PT_9f28amXi&index10&ppiAQB 相关蓝图 连招逻辑 动画通知类 逻辑分析 1.用户输入 已搭载战斗系统模块,可以收到输入指令 2.连击 第一次攻击&#xff1a; 第一次攻击&#xff0c;…