Simple Memoization in Scala
In Ruby, it’s common to use instance variables and conditional assignment to to concisely memoize expensive operations.
class MemoizeSomething
def initialize(x)
@x = x
end
def somethingExpensive
@somethingExpensive ||= begin
puts("in here, going to sleep to calculate an 'expensive' operation")
sleep(4)
"the result: #{@x}"
end
end
end
o = MemoizeSomething.new("foo")
o.somethingExpensive # => "the result: foo"
You could reuse the same of strategy of detecting nil
/null
and conditionally
evaluating the result. However Scala has lazy evaluation built in. So you could
write the following:
class MemoizeSomething(x: String) {
lazy val somethingExpensive = {
println("in here, going to sleep to calculate an 'expensive' operation")
Thread.sleep(4000)
s"the result: $x"
}
}
val o = new MemoizeSomething("foo")
o.somethingExpensive // res0: String = the result: foo
When MemoizeSomething
is initialized, it won’t evaluate somethingExpensive
right away, but the first time that variable is requested it will fully evaluate
it.
If you’re not a fan of the closure above, you could also use a separate method:
class MemoizeSomething(x: String) {
lazy val somethingExpensive = calcSomethingExpensive
def calcSomethingExpensive: String = {
println("in here, going to sleep to calculate an 'expensive' operation")
Thread.sleep(4000)
s"the result: $x"
}
}
val o = new MemoizeSomething("foo")
o.somethingExpensive // res0: String = the result: foo