Java8简单的本地缓存实现
来源:互联网 发布:2017网络用语二次元 编辑:程序博客网 时间:2024/05/02 00:01
这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。因为Map有一个新的方法,在key为Null的时候自动计算一个新的value值。非常适合实现cache。来看下代码:
public static void main(String[] args) { for (int i = 0; i < 10; i++) System.out.println( "f(" + i + ") = " + fibonacci(i));}static int fibonacci(int i) { if (i == 0) return i; if (i == 1) return 1; System.out.println("Calculating f(" + i + ")"); return fibonacci(i - 2) + fibonacci(i - 1);}
当然,这种方式很傻瓜。即使对于一个非常小的数,例如fibonacci(5),上面的代码也会打印出很多行,而且都是在进行重复计算,输出如下(只截取一部分):
Calculating f(6)Calculating f(4)Calculating f(2)Calculating f(3)Calculating f(2)Calculating f(5)Calculating f(3)Calculating f(2)Calculating f(4)Calculating f(2)Calculating f(3)Calculating f(2)f(6) = 8
我们想要做的就是创建一个缓存,用来计算斐波那契数列。最直接的方法就是在缓存中存放所有的value值。cache的创建如下:
static Map<Integer, Integer> cache = new HashMap<>()
(译者注:这种写法在java8中是允许的)
声明cache之后,通过Map.computeIfAbsent() 方法,可以在key所对应的value值不存在的情况下,计算一个新的value值。超高速缓存(Caching)!由于这个方法是自动执行的,而且我们使用了 ConcurrentHashMap对象,这个缓存是线程安全的,不需要手动的去写同步方法。另外,它不仅仅可以处理斐波那契额数列,在其他地方也可以被重复使用。
不过现在,我们看看如何在fibonacci()方法中使用缓存。
static int fibonacci(int i) { if (i == 0) return i; if (i == 1) return 1; return cache.computeIfAbsent(i, (key) -> fibonacci(i - 2) + fibonacci(i - 1));}
瞧瞧。不能比这个再简单了吧。想要证明吗?好吧,我们在每次计算一个新值的时候,加上些日志:
static int fibonacci(int i) { if (i == 0) return i; if (i == 1) return 1; return cache.computeIfAbsent(i, (key) -> { System.out.println( "Slow calculation of " + key); return fibonacci(i - 2) + fibonacci(i - 1); });}
程序输出如下:
f(0) = 0f(1) = 1Slow calculation of 2f(2) = 1Slow calculation of 3f(3) = 2Slow calculation of 4f(4) = 3Slow calculation of 5f(5) = 5Slow calculation of 6f(6) = 8Slow calculation of 7f(7) = 13Slow calculation of 8f(8) = 21Slow calculation of 9f(9) = 34
在Java7下又如何实现呢?
这样代码就会多一些,我们可以使用double-checked locking来实现:
static int fibonacciJava7(int i) { if (i == 0) return i; if (i == 1) return 1; Integer result = cache.get(i); if (result == null) { synchronized (cache) { result = cache.get(i); if (result == null) { System.out.println( "Slow calculation of " + i); result = fibonacci(i - 2) + fibonacci(i - 1); cache.put(i, result); } } } return result;}
注:你实际的解决方案很可能会用到Guava Caches。
总结:Lambdas 表达式是Java8中非常重要的一部分。同时我们不要忘记那些新添加到库中的,可以和Lambdas 配合使用的特性。
0 0
- Java8简单的本地缓存实现
- 简单实现本地缓存
- Java8-本地缓存
- Java8-本地缓存
- Java8 构建本地缓存
- 如何使用Java实现简单的本地缓存?
- iOS 简单的本地缓存
- iOS简单的本地缓存
- 简单缓存的实现
- 最简单的本地缓存方法
- java对象本地缓存机制的实现
- Java 本地缓存的实现(转)
- 分布式本地缓存的一种实现
- Openlayers4+servlet实现切片的本地缓存
- JAVA8的简单列子
- 本地通知的简单实现
- 使用Java8的Lambda实现的一个简单案例
- java缓存的简单实现
- Monobehaviour自带的方法
- js定时器(执行一次、重复执行)
- apache flume collector 安装
- 树——按“之”字形打印二叉树(层序遍历变型)
- 运算符重载
- Java8简单的本地缓存实现
- matlab读入从文件中读取大量的数据
- 快乐数
- GX3113C编译流程
- Mybatis传多个参数
- SQL Server远程调试失败
- oracle迁移数据文件
- asp.net session的应用
- 安装Sublime Text 3 插件的方法