Quelles sont les différentes techniques de mémorisation en Java? [fermé]

3 réponses

La mémorisation est également facile avec Java typesafe simple.

Vous pouvez le faire à partir de zéro avec les classes réutilisables suivantes.

Je les utilise comme des caches dont la durée de vie est la requête sur une webapp.

Utiliser la Goyave MapMaker si vous avez besoin d'une stratégie d'éviction ou de plusieurs fonctionnalités comme la synchronisation.

Si vous avez besoin de mémoriser une méthode avec de nombreux paramètres, placez simplement les paramètres dans une liste avec les deux techniques, et passez cette liste comme simple paramètre.

abstract public class Memoize0<V> {
    //the memory
    private V value;
    public V get() {
        if (value == null) {
            value = calc();
        }
        return value;
    }
    /**
     * will implement the calculation that 
     * is to be remembered thanks to this class
     */
    public abstract V calc();
}

abstract public class Memoize1<P, V> {
    //The memory, it maps one calculation parameter to one calculation result
    private Map<P, V> values = new HashMap<P, V>();

    public V get(P p) {
        if (!values.containsKey(p)) {
            values.put(p, calc(p));
        }
        return values.get(p);
    }

    /**
     * Will implement the calculations that are
     * to be remembered thanks to this class
     * (one calculation per distinct parameter)
     */
    public abstract V calc(P p);
 }

Et ceci est utilisé comme ceci

    Memoize0<String> configProvider = new Memoize0<String>() {
        @Override
        public String calc() {
            return fetchConfigFromVerySlowDatabase();
        }
    };
    final String config = configProvider.get();

    Memoize1<Long, String> usernameProvider = new Memoize1<Long, String>() {
        @Override
        public String calc(Long id) {
            return fetchUsernameFromVerySlowDatabase(id);
        }
    };
    final String username = usernameProvider.get(123L);
14
répondu lacroix1547 2014-12-17 17:37:18

Pour mémoriser des fonctions sans paramètres, utilisez Goyave Suppliers.memoize(Supplier). Pour les fonctions avec paramètres, Utilisez CacheBuilder.build(CacheLoader) avec des objets de valeur de paramètre comme clés.

20
répondu thSoft 2017-06-26 10:25:52

Oui. Utiliser caches à partir de Goyave.

Exemple:

import java.math.BigInteger;

import com.google.common.base.Preconditions;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

public class Fibonacci {
    private static final LoadingCache<Integer, BigInteger> CACHE
            = CacheBuilder.newBuilder().build(CacheLoader.from(Fibonacci::fib));

    public static BigInteger fib(int n) {
        Preconditions.checkArgument(n >= 0);
        switch (n) {
        case 0:
            return BigInteger.ZERO;
        case 1:
            return BigInteger.ONE;
        default:
            return CACHE.getUnchecked(n - 1).add(CACHE.getUnchecked(n - 2));
        }
    }
}
15
répondu Chris Jester-Young 2015-03-22 12:38:58