实际工作中能使用到Supplier的场景有哪些(防御性编程)?

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<
  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KnightHONG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值