获取或更新的功能方式

era*_*nga 3 functional-programming scala function-composition higher-order-functions

我有一个缓存,并且有两个函数可以从缓存中获取项目并将项目放入缓存中。

当获取项目(从缓存)时,如果键不存在,我需要向其填充一个值并返回该值。

以下是示例代码

class CacheComp {
    cache = Map[String, Foo]

    get(id): Foo = {
        // case(id exists) => Return matching Foo

        // case(id not exists) => Create a Foo and update the cache with created Foo. Then return updated Foo
    } 

    put(id, Foo) = {
        // put element to the cache   
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里我违反了get(id)功能的单一责任原则(SRP)。如何在不违反 SRP 的情况下做到这一点?我可以简单地将函数重命名为getOrUpdate(id). 但是有没有任何干净的函数式编程方法可以做到这一点?

pam*_*amu 5

已经getOrElseUpdate定义了一个函数mutable map

val cache = scala.collection.mutable.Map[String, String]()
cache.getOrElseUpdate("lang", "scala")
Run Code Online (Sandbox Code Playgroud)