2011-07-27 9 views
9

Estoy buscando almacenar información en un Mapa, así que no tengo que mantener, por ejemplo, un DB. En Java usaría la excelente colección de Google MapMaker y establecería un vencimiento, para mantener el caché tan fresco como sea necesario y softValues, para mantener el uso de la memoria. Entonces tendría una función que calcula el valor de una clave que actualmente no está en la memoria caché.Caché basada en mapas con vencimiento y valores variables

MapMaker().softValues 
      .expireAfterWrite(10, TimeUnit.MINUTES) 
      .makeComputingMap(Function(...)); 

¿Cuál es la mejor manera de hacer esto en Scala?

+0

Si esto está funcionando bien para usted en Java, ¿Por qué hacerlo de manera diferente en Scala? No estoy al tanto de ninguna biblioteca específica de scala para eso. –

+4

Bueno, esperaba una respuesta más idiomática. Si bien Google Guava es excelente, preferiría no tener que incluir la dependencia cuando las bibliotecas de colecciones de Scala están tan bien escritas como lo son. –

+0

Y solo FYI 'MapMaker(). SoftValues' ahora está [en desuso] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/MapMaker.html#softValues ​​()), use 'CacheBuilder.softValues ​​()' en su lugar. – sbeliakov

Respuesta

6

Como dijo Kim, ¿por qué hacerlo de manera diferente si MapMaker funciona bien para usted?

import collection.JavaConverters._ 
val cache = /* your MapMaker code creating a Java map */.asScala 

Y ahora accede al mapa de Java subyacente con los métodos de un mapa de Scala.

+1

De acuerdo, ¿pero como le dije a Kim, debe haber una forma más Scala-esque de hacer esto? –

+0

@Ben, no fuera de la caja que yo sepa. –

1

He creado un mapa de caducidad funcionalmente transparente en Scala. Agregar y eliminar elementos da un nuevo mapa, que también elimina los valores caducados.

Expiration Map

0

Estoy seguir usando solución de caché de guayaba en Scala, así :)

En primer lugar, como se señaló en uno de los comentarios, en las versiones más recientes de Guava Cache, MapMaker() ahora es obsoleto y deberías usar CacheBuilder en su lugar.

Así que ahora, en la Scala que se verá como la siguiente:

lazy val cachedData = CacheBuilder.newBuilder() 
    .expireAfterWrite(60, TimeUnit.MINUTES) 
    .maximumSize(10) 
    .build(
     new CacheLoader[Key, Data] { 
     def load(key: Key): Data = { 
      veryExpansiveDataCreation(key) 
     } 
     } 
    ) 

Para leer de él, se puede usar algo como:

def cachedData(ketToData: Key): Data = { 
    try { 
     return cachedData.get(ketToData) 
    } catch { 
     case ee: Exception => throw new YourSpecialException(ee.getMessage); 
    } 
    } 
Cuestiones relacionadas