简介
-
Java Supplier是一个功能接口,代表结果的提供者。
-
Supplier的功能方法是get()。
-
一个Supplier可以通过lambda表达式、方法引用或默认构造函数来实例化。
-
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;
}
}
总结
函数式编程应该用在抽象层次高、复用多的场景,而不是单纯业务逻辑的简单使用(反而影响代码的可阅读性)。找到具体场景中的最佳实践才能发挥函数式编程最大优点。