Java8 构建本地缓存
来源:互联网 发布:淘宝一阳指是什么 编辑:程序博客网 时间:2024/05/01 21:28
偶然想到了,之前一直用redis做key-value的缓存,为什么不能用HashMap用作缓存呢?
理由应该是redis中有很多封装好的功能,比如缓存持久化这种。
缓存实现
使用的ConcurrentHashMap做缓存,避免了递归的重复计算:
package cn.mitsuhide.Java8New;import java.util.concurrent.ConcurrentHashMap;/** * Created by baidu on 16/10/10. */public class CacheHelper { private ConcurrentHashMap<Integer, Integer> cache = new ConcurrentHashMap<>(); public static void main (String [] args) { CacheHelper ch = new CacheHelper(); System.out.println(ch.fibonaacci(12)); System.out.println(ch.fibonaacci(11)); } public int fibonaacci (int i) { if (i == 0 || i == 1) { return i; } // Java 8 Map接口中新增方法 // 首先判断缓存MAP中是否存在指定key的值,如果不存在,会自动调用mappingFunction(key) // 计算key的value,然后将key = value // 放入到缓存Map,java8会使用thread-safe的方式从cache中存取记录。 return cache.computeIfAbsent(i, (key) -> { // 函数式接口,key = i,就是传过来的key,函数中的第一个参数 System.out.println("Compute fibonaacci " + key); return fibonaacci(key - 1) + fibonaacci(key - 2); }); } public ConcurrentHashMap<Integer, Integer> getCache() { return cache; } public void setCache(ConcurrentHashMap<Integer, Integer> cache) { this.cache = cache; }}
Java 8中的新功能
Function接口
如果你正在浏览Java8的API,你会发现java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。在这篇文章中,我会简单描述Function接口,该接口目前已发布在java.util.function中。
Function接口的主要方法:
R apply(T t) – 将Function对象应用到输入的参数上,然后返回计算结果。default ‹V› Function‹T,V› – 将两个Function整合,并返回一个能够执行两个Function对象功能的Function对象。译者注:Function接口中除了apply()之外全部接口如下:default <V> Function<T,V> andThen(Function<? super R,? extends V> after) 返回一个先执行当前函数对象apply方法再执行after函数对象apply方法的函数对象。default <V> Function<T,V> compose(Function<? super V,? extends T> before)返回一个先执行before函数对象apply方法再执行当前函数对象apply方法的函数对象。static <T> Function<T,T> identity() 返回一个执行了apply()方法之后只会返回输入参数的函数对象。
http://ifeve.com/jjava-util-function-java8/
computeIfAbsent方法
在JAVA8的Map接口中,增加了一个方法computeIfAbsent,此方法签名如下:
public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
Map接口的实现类如HashMap,ConcurrentHashMap,HashTable等继承了此方法,通过此方法可以构建JAVA本地缓存,降低程序的计算量,程序的复杂度,使代码简洁,易懂。
此方法首先判断缓存MAP中是否存在指定key的值,如果不存在,会自动调用mappingFunction(key)计算key的value,然后将key = value放入到缓存Map,java8会使用thread-safe的方式从cache中存取记录。
如果mappingFunction(key)返回的值为null或抛出异常,则不会有记录存入map
0 0
- Java8 构建本地缓存
- Java8使用Map中的computeIfAbsent方法构建本地缓存
- Java8-本地缓存
- Java8-本地缓存
- java8 使用Map中的computeIfAbsent方法构建本地缓存,提高程序效率
- Java8简单的本地缓存实现
- 用Gson和SharedPreferences轻松构建android本地数据缓存
- Gson和SharedPreferences轻松构建android本地数据缓存
- 用Gson和SharedPreferences轻松构建android本地数据缓存
- 用Gson和SharedPreferences构建本地数据缓存
- Java中使用ResponseCache类构建本地缓存
- 本地缓存
- 本地缓存
- 本地缓存
- 本地缓存
- iOS开发缓存:本地缓存
- 代码本地构建
- maven构建本地仓库
- 线段树(自看)
- 找回firefox失踪的收藏按钮
- Android demo 防误删cpp---cppic.cpp
- 算法的时间复杂度和空间复杂度-总结
- 每天一个算法
- Java8 构建本地缓存
- 微信添加客服帐号{"errcode":65400,"errmsg":"please
- ES in BI
- matplotlib数据可视化入门-python
- c++读写文件
- SQL之AUTO INCREMENT 字段
- STM32值系统时钟初始化程序设计
- Java 动态加载jar和class文件
- Swift 3.0 出现 Result of all to 'XX' is unused 警告 解决