Java 8 Supplier 函数接口
这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。
Java 8 中的 Supplier
是一个函数接口,无参数,返回值类型为泛型 T。Supplier
的使用比较简单,使用场景也比较单一。
源码:Supplier
函数接口在 Java 8 中的实现。
package java.util.function;
@FunctionalInterface
public interface Supplier<T> {
T get();
}
1. Supplier
Supplier
由于没有参数输入,所以多用于对象创建,类似于一个对象创建工厂。可以使用 Lambda
方式创建任意对象,也可以使用对象构造方法的方法引用创对象。
示例1:使用 Supplier
获取一个 1 到 10 的随机数,使用 Supplier
获取当前时间
import java.time.LocalDateTime;
import java.util.Random;
import java.util.UUID;
import java.util.function.Supplier;
public class Java8Supplier {
public static void main(String[] args) {
Supplier<Integer> supplier = () -> new Random().nextInt(10);
System.out.println(supplier.get());
System.out.println(supplier.get());
Supplier<LocalDateTime> supplier2 = LocalDateTime::now;
System.out.println(supplier2.get());
System.out.println(supplier2.get());
}
}
输出结果:
9
4
2021-07-21T20:53:36.848264
2021-07-21T20:53:36.848893
2. 工厂模式
示例:利用 Supplier
构造一个工厂模式,创建不同类别的狗。
import java.util.function.Supplier;
public class Java8SupplierFactory {
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;
}
}
源码 Dog.java
public class Dog {
private String name;
private Integer age;
public Dog() {
}
public Dog(String name) {
this.name = name;
}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
// get set toString...
}
输出结果:
Dog{name='哈士奇', age=1}
Dog{name='牧羊犬', age=1}
3. Supplier 扩展类
在 Java 8 中,为了方便 Supplier
的使用,提供了指定类型的 Supplier
,有 BooleanSupplier
, DoubleSupplier
, IntSupplier
, LongSupplier
。
示例:使用 IntSupplier
获取 0 到 10 的随机数。
import java.util.Random;
import java.util.function.IntSupplier;
public class Java8SupplierInt {
public static void main(String[] args) {
IntSupplier intSupplier = () -> new Random().nextInt(10);
System.out.println(intSupplier.getAsInt());
System.out.println(intSupplier.getAsInt());
}
}
输出结果:
5
1