相关疑难解决方法(0)

由于Java 9 HashMap.computeIfAbsent()在尝试memoize递归函数结果时抛出ConcurrentModificationException

今天我从一些JS课程中学到了什么是memoization并尝试用Java实现它.我有一个简单的递归函数来评估第n个Fibonacci数:

long fib(long n) {
    if (n < 2) {
        return n;
    }

    return fib(n - 1) + fib(n - 2);
}
Run Code Online (Sandbox Code Playgroud)

然后我决定使用HashMap来缓存递归方法的结果:

private static <I, O> Function<I, O> memoize(Function<I, O> fn) {
    final Map<I, O> cache = new HashMap<>();
    return in -> {
        if (cache.get(in) != null) {
            return cache.get(in);
        } else {
            O result = fn.apply(in);
            cache.put(in, result);
            return result;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这按照我的预期工作,它允许我fib()像这样记忆memoize(this::fib)

然后,我用Google搜索记忆化的Java中的主题,发现了一个问题:Java的记忆化方法,其中computeIfAbsent提出比我的条件表达式短得多.

所以我期望工作的最终代码是:

public class FibMemo {
    private …
Run Code Online (Sandbox Code Playgroud)

java recursion concurrenthashmap java-9

11
推荐指数
1
解决办法
925
查看次数

标签 统计

concurrenthashmap ×1

java ×1

java-9 ×1

recursion ×1