gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:17:04 24 4
gpt4 key购买 nike

我想在没有 if 语句的情况下并利用 lambda 来实现延迟字段初始化(或延迟初始化)。所以,我希望有与以下 Foo 相同的行为属性(property)但没有 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我只想归还的属性(property) fooField.get() 。但现在我希望下一次调用 getFoo属性(property)避免expensiveInit()并返回之前的 T实例。

如何在不使用 if 的情况下实现这一目标? ?

尽管有命名约定并替换了 ->通过=> ,那么这个例子也可以在 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属性返回相同的结果。

关于lambda - 使用 lambda 进行延迟字段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29132884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com