```fun example(computeFoo: () -> Foo) { val...
# announcements
k
Copy code
fun example(computeFoo: () -> Foo) {
    val memoizedFoo by lazy(computeFoo)
    if (someCondition && memoizedFoo.isValid()){
        memoizedFoo.doSomething()
    }
}
Let's say
computeFoo
is a slow function, and we want to avoid calling it whenever possible. In the above code, if
someCondition == false
the
&&
will "short-circuit", meaning it won't even bother to evaluate the right side since
false && x
is guaranteed to be
false
. That means that the code behind
lazy
doesn't call
computeFoo
at all. If on the other hand
someCondition == true
,
memoizedFoo.isValid()
will be evaluated,
lazy
will call
computeFoo
and the result will be available in
memoizedFoo
.