Java8的新特性其中之一便是Supplier,不知道大家在实际的工作中是否有使用过?看过很多博客文章,大多都是介绍Supplier或者是对Supplier的简单应用,但很少有讲实际工作中能使用到Supplier的场景。洪爵在这篇文章就带着大家一起看看在实际工作中,有哪些场景可以使用到Supplier。
【b站和微信都可搜Knight洪爵,求求关注捏,干货多多】
首先,洪爵是如何认识到Supplier的呢?当然是为了防御性编程……哦不是,也不是因为它是Java8的新特性,所以才特地去了解。而是洪爵在实际工作中,发现有很多地方用到了Supplier,在不了解Supplier的前提下,去了解它并在实际项目中看它如何给使用。
我看到stackoverflow上有人提问:什么时候我们应该使用Supplier?
是的,什么时候我们应该使用Supplier,要搞清楚这一点,首先请先允许我稍微简单介绍下Supplier,这个是Supplier的源码:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
该接口定义了一个不接受任何参数但返回一个泛型类型的值的get方法,然后比较值得注意的是@FunctionalInterface,说明Supplier是一个函数式接口,然后有一个泛型T,传入T,返回的类型也是T,除此之外,好像平平无奇呀。我个人理解,写这个接口的人其实希望大家在有获取的行为或者操作时,能用到Supplier,Supplier意义为供给,它足够的抽象、足够的灵活,为什么这么说呢?让洪爵一一道来。
洪爵想先问大家一个问题,我们知道函数式接口可以使用lambda表达式来表达,下面的代码中()→”abc”,其实就相当于Supplier中get方法里有一行代码:return new String(”abc”);
import java.util.function.Supplier;
public void f() {
Supplier<String> supplier = () -> "abc"; // a行
String str = supplier.get(); // b行
}
洪爵的问题是,这个字符串abc是在哪一行代码被new出来的?是a行还是b行?
实际上是在b行被实际执行的,lambda表达式有延时计算的特点,只有实际需要用到的时候,才会真正的执行,这类似于懒加载。
Supplier接口的主要目的是延迟提供值。它通常在需要时生成或计算值,而不是在创建Supplier实例时就立即提供值。这种惰性求值的方式可以提高性能,因为它允许在真正需要值时才进行计算。
我们举几个延迟加载的例子,方便大家加深印象,也知道在工作中在什么场景才需要使用到supplier。
假设你现在有一个类,这个类里面包含了很多东西,有体积不大的对象,有体积偏大的对象,而大对象并不是每次都需要用到,就可以使用到Supplier。
import java.util.function.Supplier;
public class Main {
public static void main(String[] args<