使用 lambda 进行延迟字段初始化

2024-06-18

我想在没有 if 语句的情况下实现延迟字段初始化(或延迟初始化)并利用 lambda。所以,我希望有以下相同的行为Foo财产但没有if:

class A<T>{
    private T fooField;

    public T getFoo(){
        if( fooField == null ) fooField = expensiveInit();
        return fooField;
    }
}

忽略这个解决方案不能保证安全使用的事实:1)多线程; 2)null作为有效值T.

所以,为了表达初始化的意图fooField被推迟到第一次使用我想声明fooField类型的Supplier<T>例如:

class A<T>{
   private Supplier<T> fooField = () -> expensiveInit();

   public T getFoo(){
      return fooField.get();
   }
}

然后在getFoo我只想归还的财产fooField.get()。但现在我希望下一次调用getFoo财产避免expensiveInit()并返回之前的T实例。

我怎样才能在不使用的情况下实现这一目标if?

尽管命名约定和替换->by =>,那么这个例子也可以在 C# 中考虑。但是,. NET Framework 版本 4 已经提供了Lazy<T>具有所需的语义。


在您的实际 lambda 中,您可以简单地更新fooField使用新的 lambda,例如:

class A<T>{
    private Supplier<T> fooField = () -> {
       T val = expensiveInit();
       fooField = () -> val;
       return val;
    };

    public T getFoo(){
       return fooField.get();
    }
}

同样,这个解决方案不像 .Net 那样是线程安全的Lazy<T>,并且不确保并发调用getFoo属性返回相同的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 lambda 进行延迟字段初始化 的相关文章

随机推荐

  • “Inverse SFINAE”以避免不明确的过载

    如果第二个模板实例化 如何防止下面的第一个模板实例化 即如果两者static cast
  • 向下投射通用元素类型

    public class ConfigControlBase
  • 旋转嵌套 SVG

    我在用SVG js http svgjs com并尝试使用 SVG 进行一些操作 我以前使用过 canvas 但我对其生成的图像质量非常失望 因此我决定使用纯 SVG 我设法将所有内容都改为纯 SVG 方法 除了一件事 旋转 我无法让它发挥
  • ngRepeat 中的函数执行过于频繁

    我有三个tabs里面有不同的htmlng include 这些选项卡使用以下方式显示ng repeat 只有一个 HTML 模板包含函数调用 但它执行了 3 次 每个模板执行一次 ng repeat迭代 这里出了什么问题以及如何解决它 va
  • 在 django 管理表单中的选择性文本区域上使用 ckEditor

    我想在 django 管理表单中的特定文本区域应用 ckeditor 而不是在所有文本区域 下面的代码片段将在 django 表单上的每个文本区域上应用 ckeditor class ProjectAdmin admin ModelAdmi
  • 如何处理 MSTest 中的 currentDomain.UnhandledException

    我尝试根据答案实施解决方案单元测试时如何处理其他线程引发的异常 https stackoverflow com a 934604 518530 但我仍然不明白在处理程序中要做什么 假设我有一个测试 TestMethod void Test
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • String.contains() 的时间复杂度

    String contains 的时间复杂度是多少 假设 n 是与另一个长度为 k 的字符串进行比较的字符串的长度 如果不知道您感兴趣的 String contains 的实际实现 就没有答案 或者你打算使用什么算法 一个完全幼稚的实现可能
  • 在 Android Webview 中加载 Angular JS 网站的问题

    大家好我正在尝试加载GTV http gtvqa com Android WebView 中 它在移动浏览器中加载得很好 但在 webview 中则不行 这是我的代码 WebView theWebPage new WebView this
  • OpenPyXL - 如何查询单元格边框?

    python 和 openpyxl 都是新的 编写一个 py 脚本来遍历大量 Excel 工作簿 工作表 并且需要找到由边框格式标识的某些单元格 我在网上看到几个关于如何设置单元格边框的示例 但我需要阅读它们 具体来说 当表内的数据不一致但
  • 将小箭头添加到 iPhone TableView 单元格中单元格的右侧

    这应该很简单 我有一个带有 TableView 的 iPhone 应用程序 如何将经典的小箭头添加到每个单元格的右侧 只需设置相应的附件类型的财产UITableViewCell cell accessoryType UITableViewC
  • 仅使用按位运算在 C 中实现更大的等号

    我知道许多基本运算 例如加法或除法 也可以仅使用按位运算符在 C 中实现 如何使用大于或等号 gt 执行相同操作 if x gt 0 我能想出的最简单的解决方案 include
  • 如何分组显示argparse子命令?

    对于具有许多子命令的程序 我想在 help 输出中显示它们按逻辑分组 Python argparse 有一个add argument group http docs python org library argparse html argp
  • pandas 系列值之间的过滤

    If s is a pandas Series http pandas pydata org pandas docs stable dsintro html series 我知道我可以这样做 b s lt 4 or b s gt 0 但我做
  • Primefaces 中动态生成条形图

    我正在使用 Primefaces 4 0 我需要根据查询结果的数量生成条形图 条形图的标题和颜色也应该能够为所有使用查询结果的人动态设置 条形图示例如下
  • 备份并上传到FTP服务器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 谁能指导我一个脚本解决方案来备份目录并将其上传到 ftp 服务器 我最初正在寻找批处理脚本 但任何解决
  • 在 javafx.scene.control.TextArea 和 javafx.scene.control.TextField 中设置插入符位置

    我需要在代码中手动设置插入符位置 有一个getCaretPosition under javafx scene control TextInputControl但没有setter方法 如何设置插入符位置 TextArea ta new Te
  • 从另一台计算机访问 MYSQL

    我想开发一个java桌面应用程序 我想在其中设置服务器 这意味着我在这里使用mysql db 该数据库将仅存储在一台电脑上 其余所有用户都可以访问该数据库 所以 我听说了mysql远程连接 其中尝试了一些事情 这些措施如下 我的电脑已连接w
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • 使用 lambda 进行延迟字段初始化

    我想在没有 if 语句的情况下实现延迟字段初始化 或延迟初始化 并利用 lambda 所以 我希望有以下相同的行为Foo财产但没有if class A