java 中的 Supplier 接口
在 Java 中,Supplier 是一个功能性接口,它来自于 java.util.function 包。Supplier 接口代表一个提供结果的供应商,它不接受任何参数,但返回一个结果。常用于延迟计算、工厂模式和其他场景。
以下是 Supplier 的简单解释和用法示例:
Supplier 接口的定义
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Supplier 接口只有一个抽象方法 get(),它不接受任何参数,但会返回一个类型为 T 的对象。
Supplier 的典型用法
- 延迟计算:当你希望某个值在需要的时候才进行计算。
- 工厂模式:通过
Supplier提供实例化对象的方式。
使用示例
1. 基本用法
以下是一个简单的例子,展示如何使用 Supplier 来提供一个字符串:
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
Supplier<String> stringSupplier = () -> "Hello, World!";
System.out.println(stringSupplier.get()); // 输出: Hello, World!
}
}
2. 延迟计算
使用 Supplier 可以实现延迟计算,这在需要惰性加载(Lazy Loading)的场景中特别有用:
import java.util.function.Supplier;
public class LazyLoadingExample {
public static void main(String[] args) {
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println("Random value: " + randomSupplier.get());
}
}
3. 与其他 API 结合
在 Java 8 中,许多新的 API 方法都接受 Supplier 参数。例如,Optional.orElseGet() 方法接受一个 Supplier 来提供默认值:
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optional = Optional.empty();
System.out.println(optional.orElseGet(() -> "Default Value")); // 输出: Default Value
}
}
4. 自定义工厂方法
使用 Supplier 可以实现工厂方法模式,创建不同类型的对象:
import java.util.function.Supplier;
class Car {
private String name;
public Car(String name) {
this.name = name;
}
@Override
public String toString() {
return "Car{name='" + name + "'}";
}
}
public class FactoryExample {
public static void main(String[] args) {
Supplier<Car> carFactory = () -> new Car("Tesla");
Car car = carFactory.get();
System.out.println(car); // 输出: Car{name='Tesla'}
}
}
总结
Supplier 是一个简单而强大的功能性接口,广泛用于延迟计算、惰性加载和工厂模式。通过使用 Supplier,可以使代码更加简洁、灵活和易于维护。