简介

  1. Java Supplier是一个功能接口,代表结果的提供者。

  2. Supplier的功能方法是get()。

  3. 一个Supplier可以通过lambda表达式、方法引用或默认构造函数来实例化。

  4. Supplier在Java 8中被引入,属于java.util.function包。

源码分析

@FunctionalInterface
public interface Supplier<T> {

	//get()方法不接受任何参数,只返回通用类型的值。
    T get();
}

  • 我们可以看到在上面的代码中,Supplier有get()方法,可以返回通用类型的值。

  • Java还提供了返回特定类型值的Supplier。

  • BooleanSupplier返回Boolean数据类型,IntSupplier返回Integer数据类型,LongSupplier返回Long数据类型,DoubleSupplier返回Double数据类型值。

使用示例

@ApiModel(value = "Supplier")
public class SupplierDemo1 {

    @Test
    public void supplierTest () {
        //使用Lambda表达式实例化Supplier
        Supplier<String> supplier = () -> "hello wangJieSheng";
        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
        Console.log("{}-->{}", methodName, supplier.get());
        //输出:supplierTest-->hello wangJieSheng

        //使用方法引用实例化Supplier
        Supplier<String> supplier2 = User::getNameAndAge;
        Console.log("{}-->{}", methodName, supplier2.get());
        //输出:supplierTest-->wangjiesheng今年29了,加油!

        //使用默认构造函数实例化Supplier
        Supplier<User> supplier3 = User::new;
        User user = supplier3.get();
        Console.log("{}-->{}", methodName, user.getName());
        //输出:supplierTest-->wangjiesheng

    }

    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public static class User {

        public static String getNameAndAge() {
            return StrUtil.format("{}今年{}了,加油!", "wangjiesheng", 29);
        }

        private String name = "wangjiesheng";
        private int age = 29;
    }

}

总结

函数式编程应该用在抽象层次高、复用多的场景,而不是单纯业务逻辑的简单使用(反而影响代码的可阅读性)。找到具体场景中的最佳实践才能发挥函数式编程最大优点。