Java
Supplier
是一个功能接口,代表结果的提供者。
Supplier
的功能方法是get()
。
一个Supplier
可以通过lambda
表达式、方法引用或默认构造函数来实例化。
Supplier
在Java 8
中被引入,属于java.util.function
包。
Supplier
功能接口的源代码如下。
@FunctionalInterface
public interface Supplier {
T get();
}
我们可以看到在上面的代码中,Supplier
有get()
方法,可以返回通用类型的值。
get()
方法不接受任何参数,只返回通用类型的值。
我们可以按以下方式实例化Supplier
。
Supplier s = () -> "Hello World!";
Java
还提供了返回特定类型值的Supplier
。
BooleanSupplier
返回Boolean
数据类型,IntSupplier
返回Integer
数据类型,LongSupplier
返回Long
数据类型,DoubleSupplier
返回Double
数据类型值。
我们还可以根据我们的要求创建自定义的功能接口。
我们将在这里使用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 s1 = () -> "Hello World!";
System.out.println(s1.get());
Random random = new Random();
Supplier s2 = () -> random.nextInt(10);
System.out.println(s2.get());
}
}
输出
Hello World!
9
方法引用使用(::
)符号来调用方法。假设我们有一个MyUtil
类和一个静态方法getFavoriteBook()
,那么我们可以用类名来调用它。
MyUtil::getFavoriteBook
如果我们有非静态方法,我们可以使用类的实例来调用这个方法。
假设myUtil
是MyUtil
类的实例,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 s1 = MyUtil::getFavoriteBook;
System.out.println(s1.get());
MyUtil myUtil = new MyUtil();
Supplier s2 = myUtil::getAge;
System.out.println(s2.get());
Random random = new Random();
Supplier 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
,即默认构造函数。
找到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 s1 = Random::new;
Random random = s1.get();
System.out.println(random.nextInt(10));
Supplier 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
我们可以使用@FunctionalInterface
注解创建一个自定义的Supplier
功能接口。
我们的Supplier
不接受参数,但返回一个通用类型的值。
CustomSupplierDemo.java
import java.util.Random;
@FunctionalInterface
interface MySupplier {
T fetch();
}
public class CustomSupplierDemo {
public static void main(String[] args) {
//Using Lambda Expression
MySupplier s1 = () -> "Hello World!";
System.out.println(s1.fetch());
//Using Method Reference
Random random = new Random();
MySupplier s2 = random::nextInt;
System.out.println(s2.fetch());
//Using Constructor
MySupplier s3 = Random::new;
Random rdm = s3.fetch();
System.out.println(rdm.nextInt(10));
}
}
输出
Hello World!
521143516
6
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
都是功能接口。
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 s = Country::getPMName;
Consumer 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