diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java
new file mode 100644
index 000000000..95832ce27
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java
@@ -0,0 +1,67 @@
+package cn.hutool.core.lang.loader;
+
+import cn.hutool.core.lang.Assert;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+/**
+ * 函数式懒加载加载器
+ * 传入用于生成对象的函数,在对象需要使用时调用生成对象,然后抛弃此生成对象的函数。
+ * 此加载器常用于对象比较庞大而不一定被使用的情况,用于减少启动时资源占用问题
+ * 继承自{@link LazyLoader},如何实现多线程安全,由LazyLoader完成。
+ *
+ * @param 被加载对象类型
+ * @author Mr.Po
+ * @see cn.hutool.core.lang.loader.LazyLoader
+ */
+public final class LazyFunLoader extends LazyLoader {
+
+ /**
+ * 用于生成对象的函数
+ */
+ private Supplier supplier;
+
+ /**
+ * 构造
+ *
+ * @param supplier 用于生成对象的函数
+ */
+ public LazyFunLoader(Supplier supplier) {
+ Assert.notNull(supplier);
+ this.supplier = supplier;
+ }
+
+ @Override
+ protected T init() {
+
+ T t = this.supplier.get();
+ this.supplier = null;
+
+ return t;
+ }
+
+ /**
+ * 是否已经初始化
+ *
+ * @return 是/否
+ */
+ public boolean isInitialize() {
+ return this.supplier == null;
+ }
+
+ /**
+ * 如果已经初始化,就执行传入函数
+ *
+ * @param consumer 待执行函数
+ */
+ public void ifInitialized(Consumer consumer) {
+
+ Assert.notNull(consumer);
+
+ // 已经初始化
+ if (this.isInitialize()) {
+ consumer.accept(this.get());
+ }
+ }
+}
diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java
new file mode 100644
index 000000000..6de9cb529
--- /dev/null
+++ b/hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java
@@ -0,0 +1,45 @@
+package cn.hutool.core.lang.loader;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LazyFunLoaderTest {
+
+ static class BigObject {
+
+ private boolean isDestroy = false;
+
+ public void destroy() {
+ this.isDestroy = true;
+ }
+ }
+
+ @Test
+ public void test1() {
+
+ LazyFunLoader loader = new LazyFunLoader<>(BigObject::new);
+
+ Assert.assertNotNull(loader.get());
+ Assert.assertTrue(loader.isInitialize());
+
+ // 对于某些对象,在程序关闭时,需要进行销毁操作
+ loader.ifInitialized(BigObject::destroy);
+
+ Assert.assertTrue(loader.get().isDestroy);
+ }
+
+ @Test
+ public void test2() {
+
+ LazyFunLoader loader = new LazyFunLoader<>(BigObject::new);
+
+ // 若从未使用,则可以避免不必要的初始化
+ loader.ifInitialized(it -> {
+
+ Assert.fail();
+ it.destroy();
+ });
+
+ Assert.assertFalse(loader.isInitialize());
+ }
+}