emanjusaka —— 彼岸花开可奈何

彼岸花开可奈何

Java8 的 Supplier 函数式接口

5
2024-05-31

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();
 }

我们可以在上面的代码中看到 Supplierget() 方法返回泛型值。方法 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

参考资料

Java Supplier Example

在技术的星河中遨游,我们互为引路星辰,共同追逐成长的光芒。愿本文的洞见能触动您的思绪,若有所共鸣,请以点赞之手,轻抚赞同的弦。

原文地址: https://www.emanjusaka.top/2024/05/java-supplier-example

微信公众号:emanjusaka的编程栈