Java 8 中的 Supplier
是一个函数接口,无参数,返回值类型为泛型 T。Supplier
的使用比较简单,使用场景也比较单一。
通俗的来说Supplier相当于一个放东西的容器,你可以在这个容器里放一些没有入参的代码,然后返回T类型,当调用get()方法的时候才会去执行容器里的代码得到返回值。
一、supplier普通使用
示例代码1:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.Supplier;
public class MainServer {
public static void main(String[] args) throws InterruptedException {
Supplier<String> supplier = () -> {
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("Supplier测试");
return localDateTime.format(f1);
};
System.out.println("开始");
System.out.println("当前时间:" + supplier.get());
Thread.sleep(1000L);
System.out.println("再次获取当前时间:" + supplier.get());
}
}
输出:
开始
Supplier测试
当前时间:2022-04-20 09:39:24
Supplier测试
再次获取当前时间:2022-04-20 09:39:25
示例代码2:
import java.util.function.Supplier;
public class MainServer {
public static void main(String[] args) {
Supplier<Double> randomValue = () -> Math.random();
System.out.println("获取随机数:" + randomValue.get());
System.out.println("再次获取随机数:" + randomValue.get());
}
}
输出:
获取随机数:0.702892997077614
再次获取随机数:0.3871863980392035
二、supplier在工厂模式中使用
import java.util.function.Supplier;
public class MainServer {
public static void main(String[] args) {
Dog dog1 = dogFactory(() -> new Dog("哈士奇"));
Dog dog2 = dogFactory(() -> new Dog("牧羊犬"));
System.out.println(dog1);
System.out.println(dog2);
}
public static Dog dogFactory(Supplier<? extends Dog> supplier) {
Dog dog = supplier.get();
dog.setAge(1);
return dog;
}
}
public class Dog {
private final String name;
private Integer age;
public Dog(String name) {
this.name = name;
}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" + "name='" + name + ", age=" + age + '}';
}
}
输出:
Dog{name='哈士奇, age=1}
Dog{name='牧羊犬, age=1}
三、 Supplier 扩展类
在 Java 8 中,为了方便 Supplier
的使用,提供了指定类型的 Supplier
,有 BooleanSupplier
, DoubleSupplier
, IntSupplier
, LongSupplier
。
import java.util.Random;
import java.util.function.IntSupplier;
public class MainServer {
public static void main(String[] args) {
IntSupplier intSupplier = () -> new Random().nextInt(10);
System.out.println(intSupplier.getAsInt());
System.out.println(intSupplier.getAsInt());
}
}
输出:
0
9
参考:
Supplier Interface in Java with Examples
Java 8 Supplier 函数接口
java1.8之supplier理解