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

参考

扩展阅读:Java 8 Predicate 函数接口Java 8 Function 函数接口