Java Supplier
是代表结果提供者的函数接口。 Supplier
的函数方法是get()
。可以使用 lambda 表达式或方法引用或默认构造函数来实例化 Supplier
。 Supplier
已在 Java 8 中引入,属于 java.util.function
包。 Supplier
函数接口源代码如下。
@FunctionalInterface
public interface Supplier<T> {
T get();
}
我们可以在上面的代码中看到 Supplier
具有返回泛型类型值的 get()
方法。 get()
方法不接受任何参数,只返回泛型类型的值。我们可以如下实例化 Supplier
。
Supplier<String> s = () -> "Hello World!";
Java 还提供了返回特定类型值的Supplier接口。 BooleanSupplier
返回布尔数据类型,IntSupplier
返回整数数据类型,LongSupplier
返回长数据类型,DoubleSupplier
返回双精度数据类型值。我们还可以根据我们的要求创建自定义函数接口。
我们将在此处使用 lambda 表达式实例化 Supplier
。我们知道它的方法 get()
只返回值,不接受任何参数,所以我们的 lambda 表达式将有空参数部分。
SupplierWithLambda.java
package com.concretepage;
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
方法引用使用 (::) 符号调用方法。假设我们有一个类 MyUtil
和一个静态方法 getFavoriteBook()
,那么我们可以使用类名来调用它。
MyUtil::getFavoriteBook
如果我们有非静态方法,那么我们可以使用类的实例调用这个方法。假设 myUtil
是 MyUtil
类的实例,并且 getAge()
是非静态方法,那么我们使用下面给出的实例来调用它。
myUtil::getAge
我们知道 Supplier
函数接口的 get()
方法没有参数,所以我们的方法 getFavoriteBook()
和 getAge()
不应该接受任何参数。找到例子。
SupplierWithMethodReference.java
package com.concretepage;
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
。查找 Book
类的构造函数参考。
Book::new
查找示例示例以使用默认构造函数实例化 Supplier
。
SupplierWithConstructorRef.java
package com.concretepage;
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
我们可以使用 @FunctionalInterface
注释创建自定义Supplier接口函数接口。我们的Supplier接口我们不接受任何参数,而是返回一个泛型类型的值。
CustomSupplierDemo.java
package com.concretepage;
import java.util.Random;
@FunctionalInterface
interface MySupplier<T> {
T fetch();
}
public class CustomSupplierDemo {
public static void main(String[] args) {
//Using Lambda Expression
MySupplier<String> s1 = () -> "Hello World!";
System.out.println(s1.fetch());
//Using Method Reference
Random random = new Random();
MySupplier<Integer> s2 = random::nextInt;
System.out.println(s2.fetch());
//Using Constructor
MySupplier<Random> s3 = Random::new;
Random rdm = s3.fetch();
System.out.println(rdm.nextInt(10));
}
}
输出
Hello World!
521143516
6
Java 提供了以下用于特定数据类型Supplier接口的函数接口。
BooleanSupplier:Supplier接口返回布尔值。它的方法是getAsBoolean()
。
IntSupplier:Supplier接口返回整数数据类型值。它的方法是getAsInt()
。
LongSupplier:Supplier接口返回长数据类型值。它的方法是getAsLong()
。
DoubleSupplier:Supplier接口返回双精度数据类型值。它的方法是getAsDouble()
。
查找示例示例。
SpecificDataTypeSupplier.java
package com.concretepage;
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
package com.concretepage;
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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/java/java-8/java-supplier
内容来源于网络,如有侵权,请联系作者删除!