Java8 的 Supplier 函数式接口
by emanjusaka from https://www.emanjusaka.top/2024/05/java-supplier-example 彼岸花开可奈何
本文欢迎分享与聚合,全文转载请留下原文地址。
Java 中的 Supplier
是一个函数式接口,函数方法是 get()
。它代表一个结果的提供者,不要求每次调用提供者时都返回新的或不同的结果。
我们可以通过三种方式来对 Supplier 进行实例化:
Lambda 表达式
方法引用
默认构造函数
Supplier
已在 Java8 中引入,属于 java.util.function
包。
@FunctionalInterface
public interface Supplier<T> {
T get();
}
我们可以在上面的代码中看到 Supplier
有 get()
方法返回泛型值。方法 get()
不接受任何参数,仅返回泛型值。
使用 Lambda 表达式实例化 Supplier
package top.emanjusaka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.function.Supplier;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Supplier<String> s1 = () -> "Hello emanjusaka!";
System.out.println(s1.get());
Supplier<Integer> s2 = () -> Integer.valueOf(10);
System.out.println(s2.get());
}
}
输出
Hello emanjusaka!
10
使用方法引用实例化 Supplier
方法引用使用(::)符号来调用方法。假设我们有一个类 Student
和一个静态方法 getName()
,那么我们可以使用类名来调用它。
如果我们有非静态方法,那么我们可以使用类的实例调用该方法。假设 student 是 Student
类的实例,getScore()
是非静态方法,那么我们使用实例来调用它。
package top.emanjusaka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import top.emanjusaka.domain.Student;
import java.util.Random;
import java.util.function.Supplier;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Supplier<String> s1 = Student::getName;
System.out.println(s1.get());
Student student = new Student();
Supplier<Integer> s2 = student::getScore;
System.out.println(s2.get());
Random random = new Random();
Supplier<Integer> s3 = random::nextInt;
System.out.println(s3.get());
}
}
package top.emanjusaka.domain;
public class Student {
private Integer score = 85;
public static String getName() {
return "emanjusaka";
}
public Integer getScore() {
return score;
}
}
输出
emanjusaka
85
320674876
使用默认构造函数实例化 Supplier
package top.emanjusaka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import top.emanjusaka.domain.Person;
import java.util.Random;
import java.util.function.Supplier;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Supplier<Random> s1 = Random::new;
Random r1 = s1.get();
System.out.println(r1.nextInt(10));
Supplier<Person> s2 = Person::new;
Person person = s2.get();
System.out.println(person.getName());
}
}
package top.emanjusaka.domain;
public class Person {
private String name = "emanjusaka";
public String getName() {
return name;
}
}
输出
3
emanjusaka
自定义 Supplier 函数接口
我们可以使用@FunctionalInterface
注解创建自定义 supplier 函数接口。我们的 supplier 不接受任何参数,但返回一个泛型值。
package top.emanjusaka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import top.emanjusaka.function.CustomSupplier;
import java.util.Random;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
CustomSupplier<String> s1 = () -> "Hello emanjusaka!";
System.out.println(s1.fetch());
Random random = new Random();
CustomSupplier<Integer> s2 = random::nextInt;
System.out.println(s2.fetch());
CustomSupplier<Random> s3 = Random::new;
Random r = s3.fetch();
System.out.println(r.nextInt(10));
}
}
package top.emanjusaka.function;
@FunctionalInterface
public interface CustomSupplier<T> {
T fetch();
}
输出
Hello emanjusaka!
-793422665
4
对比 Supplier 和 Consumer
Supplier 和 Consumer 都是 Java 中的函数式接口。Supplier 代表一个提供结果的供应商,它返回一个对象并且不接受任何参数;而 Consumer 代表一个操作,它接受一个单一的输入参数没有返回结果。
Supplier 函数接口的方法:
T get()
Consumer 函数接口的方法:
void accept(T t)
package top.emanjusaka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import top.emanjusaka.domain.Student;
import java.util.function.Consumer;
import java.util.function.Supplier;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Supplier<String> s = Student::getName;
Consumer<String> c = Student::printMessage;
c.accept(s.get());
}
}
package top.emanjusaka.domain;
public class Student {
public static String getName() {
return "emanjusaka";
}
public static void printMessage(String msg) {
System.out.println(msg);
}
}
输出
emanjusaka
参考资料
在技术的星河中遨游,我们互为引路星辰,共同追逐成长的光芒。愿本文的洞见能触动您的思绪,若有所共鸣,请以点赞之手,轻抚赞同的弦。
原文地址: https://www.emanjusaka.top/2024/05/java-supplier-example
微信公众号:emanjusaka的编程栈