Guava的Optional.or()的预期行为是什么?

时间:2019-03-05 22:41:22

标签: java guava optional chaining

我链接可选对象的方法并没有按照我的想法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_2function_3

我的程序肯定可以进行额外的计算

2 个答案:

答案 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_1or将在任何情况下运行。

可能更适合您的选项是带有function_2的重载版本,这意味着延迟评估。

function_3

更新

这是一种Supplier方法(可能会发生变化),我发现它完全没有用。它将public abstract T or(Supplier<? extends T> supplier) 解析为@Beta,从而破坏了建立链的机会。基本上,您无法使用此方法重写代码段。

更新1

但是您可以切换到Java的Supplier<? extend T>并编写

T

没那么表现力,但是按预期工作。

我的格式太糟糕了,但是你明白了;)

答案 1 :(得分:1)

Guava "gently recommends" to use Java's Optional

因此,请使用Java的Optional编写清晰易懂的代码:

function_1

在这种情况下,您会看到,使用给定的设置,将调用function_2function_3,但不会调用{{1}}。