我链接可选对象的方法并没有按照我的想法from reading the docs.
假设所有function_n
返回一个Optional<Foo>
public Foo getFooFromService() {
return this.function_1()
.or(this.function_2())
.or(this.function_3())
.or(DEFAULT_VAL)
我认为对于上面的代码,如果function_1
返回了一个不存在的Optional,则程序将返回它的内部值(.get()的结果),并且不对它进行任何进一步的计算function_2
和function_3
我的程序肯定可以进行额外的计算
答案 0 :(得分:5)
为了从write
返回值,必须执行template<typename... Args>
void write(Args&&... args)
{
std::unique_lock<std::mutex> lock(_writerMutex);
_write(std::forward<Args>(args)...);
}
template<typename First, typename... Rest>
void _write(First&& param1, Rest&&... param) // private method
{
i_buf << std::forward<First>(param1) << ", ";
_write(std::forward<Rest>(param)...);
}
void _write()
{
i_fout << i_buf.str() << std::endl;
i_buf.clear();
}
和三个getFooFromService
,这意味着将评估它们的参数。 function_1
和or
将在任何情况下运行。
可能更适合您的选项是带有function_2
的重载版本,这意味着延迟评估。
function_3
更新
这是一种Supplier
方法(可能会发生变化),我发现它完全没有用。它将public abstract T or(Supplier<? extends T> supplier)
解析为@Beta
,从而破坏了建立链的机会。基本上,您无法使用此方法重写代码段。
更新1
但是您可以切换到Java的Supplier<? extend T>
并编写
T
没那么表现力,但是按预期工作。
我的格式太糟糕了,但是你明白了;)
答案 1 :(得分:1)
Optional
因此,请使用Java的Optional
编写清晰易懂的代码:
function_1
在这种情况下,您会看到,使用给定的设置,将调用function_2
和function_3
,但不会调用{{1}}。