前言
平時我們都會封裝一些處理緩存或其他的小工具。但每個人都封裝一次,重復造輪子,有點費時間。有沒有一些好的工具庫推薦-guava。guava是谷歌基于java封裝好的開源庫,它的性能、實用性,比我們自己造的輪子更好,畢竟谷歌出品,下面介紹下幾個常用的guava工具類
關注公眾號,一起交流,微信搜一搜: 潛行前行
guava的maven配置引入
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0-jre</version> </dependency>復制代碼
LoadingCache
CacheBuilder 方法參數 | 描述 |
initialCapacity(int initialCapacity) | 緩存池的初始大小 |
concurrencyLevel(int concurrencyLevel) | 設置并發數 |
maximumSize(long maximumSize) | 緩存池大小,在緩存項接近該大小時, Guava開始回收舊的緩存項 |
weakValues() | 設置value的存儲引用是虛引用 |
softValues() | 設置value的存儲引用是軟引用 |
expireAfterWrite(long duration, TimeUnit unit) | 設置時間對象沒有被寫則對象從內存中刪除(在另外的線程里面不定期維護) |
expireAfterAccess(long duration, TimeUnit unit) | 設置時間對象沒有被讀/寫訪問則對象從內存中刪除(在另外的線程里面不定期維護) |
refreshAfterWrite(long duration, TimeUnit unit) | 和expireAfterWrite類似,不過不立馬移除key,而是在下次更新時刷新,這段時間可能會返回舊值 |
removalListener( RemovalListener<? super K1, ? super V1> listener) | 監聽器,緩存項被移除時會觸發 |
build(CacheLoader<? super K1, V1> loader) | 當數據不存在時,則使用loader加載數據 |
LoadingCache<Integer,Long> cacheMap = CacheBuilder.newBuilder().initialCapacity(10) .concurrencyLevel(10) .expireAfterAccess(Duration.ofSeconds(10)) .weakValues() .recordStats() .removalListener(new RemovalListener<Integer,Long>(){ @Override public void onRemoval(RemovalNotification<Integer, Long> notification) { System.out.println(notification.getValue()); } }) .build(new CacheLoader<Integer,Long>(){ @Override public Long load(Integer key) throws Exception { return System.currentTimeMillis(); } });cacheMap.get(1);復制代碼
Multimap 和 MultiSet
//Multimap: key-value key可以重復,value也可重復Multimap<String, String> multimap = ArrayListMultimap.create();multimap.put("csc","1");multimap.put("lwl","1");multimap.put("csc","1");multimap.put("lwl","one");System.out.println(multimap.get("csc"));System.out.println(multimap.get("lwl"));---------------------------[1, 1][1, one]復制代碼
//MultiSet: 無序+可重復 count()方法獲取單詞的次數 增強了可讀性+操作簡單Multiset<String> set = HashMultiset.create();set.add("csc");set.add("lwl");set.add("csc");System.out.println(set.size());System.out.println(set.count("csc"));---------------------------32復制代碼
BiMap
BiMap<Integer,String> biMap = HashBiMap.create();biMap.put(1,"lwl");biMap.put(2,"csc");BiMap<String, Integer> map = biMap.inverse(); // value和key互轉map.forEach((v, k) -> System.out.println(v + "-" + k));復制代碼
Table
// 雙鍵的Map Map--> Table-->rowKey+columnKey+value Table<String, String, Integer> tables = HashbasedTable.create();tables.put("csc", "lwl", 1);//row+column對應的valueSystem.out.println(tables.get("csc","lwl"));復制代碼
Sets和Maps
// 不可變集合的創建ImmutableList<String> iList = ImmutableList.of("csc", "lwl");ImmutableSet<String> iSet = ImmutableSet.of("csc", "lwl");ImmutableMap<String, String> iMap = ImmutableMap.of("csc", "hello", "lwl", "world");復制代碼
set的交集, 并集, 差集
HashSet setA = newHashSet(1, 2, 3, 4, 5); HashSet setB = newHashSet(4, 5, 6, 7, 8); //并集SetView union = Sets.union(setA, setB); //差集 setA-setBSetView difference = Sets.difference(setA, setB); //交集SetView intersection = Sets.intersection(setA, setB); 復制代碼
map的交集,并集,差集
HashMap<String, Integer> mapA = Maps.newHashMap();mapA.put("a", 1);mapA.put("b", 2);mapA.put("c", 3);HashMap<String, Integer> mapB = Maps.newHashMap();mapB.put("b", 20);mapB.put("c", 3);mapB.put("d", 4);MapDifference<String, Integer> mapDifference = Maps.difference(mapA, mapB);//mapA 和 mapB 相同的 entrySystem.out.println(mapDifference.entriesInCommon());//mapA 和 mapB key相同的value不同的 entrySystem.out.println(mapDifference.entriesDiffering());//只存在 mapA 的 entrySystem.out.println(mapDifference.entriesOnlyOnLeft());//只存在 mapB 的 entrySystem.out.println(mapDifference.entriesOnlyOnRight());;-------------結果-------------{c=3}{b=(2, 20)}{a=1}{d=4}復制代碼
EventBus
@Data@AllArgsConstructorpublic class OrderMessage { String message;}//使用 @Subscribe 注解,表明使用dealWithEvent 方法處理 OrderMessage類型對應的消息//可以注解多個方法,不同的方法 處理不同的對象消息public class OrderEventListener { @Subscribe public void dealWithEvent(OrderMessage event) { System.out.println("內容:" + event.getMessage()); }}-------------------------------------// new AsyncEventBus(String identifier, Executor executor);EventBus eventBus = new EventBus("lwl"); eventBus.register(new OrderEventListener());// 發布消息eventBus.post(new OrderMessage("csc"));復制代碼
StopWatch
Stopwatch stopwatch = Stopwatch.createStarted();for(int i=0; i<100000; i++){ // do some thing}long nanos = stopwatch.elapsed(TimeUnit.MILLISECONDS);System.out.println("邏輯代碼運行耗時:"+nanos);復制代碼
Files文件操作
File newFile = new File("D:/text.txt");Files.write("this is a test".getBytes(), newFile);//再次寫入會把之前的內容沖掉Files.write("csc".getBytes(), newFile);//追加寫Files.append("lwl", newFile, Charset.defaultCharset());復制代碼
File newFile = new File("E:/text.txt");List<String> lines = Files.readLines(newFile, Charset.defaultCharset());復制代碼
方法 | 描述 |
Files.copy(File from, File to) | 復制文件 |
Files.deleteDirectoryContents(File directory) | 刪除文件夾下的內容(包括文件與子文件夾) |
Files.deleteRecursively(File file) | 刪除文件或者文件夾 |
Files.move(File from, File to) | 移動文件 |
Files.touch(File file) | 創建或者更新文件的時間戳 |
Files.getFileExtension(String file) | 獲得文件的擴展名 |
Files.getNameWithoutExtension(String file) | 獲得不帶擴展名的文件名 |
Files.map(File file, MapMode mode) | 獲取內存映射buffer |
RateLimiter
//RateLimiter 構造方法,每秒限流permitsPerSecondpublic static RateLimiter create(double permitsPerSecond) //每秒限流 permitsPerSecond,warmupPeriod 則是數據初始預熱時間,從第一次acquire 或 tryAcquire 執行開時計算public static RateLimiter create(double permitsPerSecond, Duration warmupPeriod)//獲取一個令牌,阻塞,返回阻塞時間public double acquire()//獲取 permits 個令牌,阻塞,返回阻塞時間public double acquire(int permits)//獲取一個令牌,超時返回public boolean tryAcquire(Duration timeout)////獲取 permits 個令牌,超時返回public boolean tryAcquire(int permits, Duration timeout)復制代碼
RateLimiter limiter = RateLimiter.create(2, 3, TimeUnit.SECONDS);System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");System.out.println("get one permit cost time: " + limiter.acquire(1) + "s");--------------- 結果 -------------------------get one permit cost time: 0.0sget one permit cost time: 1.331672sget one permit cost time: 0.998392sget one permit cost time: 0.666014sget one permit cost time: 0.498514sget one permit cost time: 0.498918sget one permit cost time: 0.499151sget one permit cost time: 0.488548s復制代碼
Guava Retry
<dependency> <groupId>com.github.rholder</groupId> <artifactId>guava-retrying</artifactId> <version>2.0.0</version></dependency>復制代碼
RetryerBuilder方法 | 描述 |
withRetryListener | 重試監聽器 |
withWaitStrategy | 失敗后重試間隔時間 |
withStopStrategy | 停止策略 |
withBlockStrategy | 阻塞策略BlockStrategy |
withAttemptTimeLimiter | 執行時間限制策略 |
retryIfException | 發生異常,則重試 |
retryIfRuntimeException | 發生RuntimeException異常,則重試 |
retryIfExceptionOfType(Class<? extends Throwable> ex) | 發生ex異常,則重試 |
retryIfException(Predicate<Throwable> exceptionPredicate) | 對異常判斷,是否重試 |
retryIfResult(Predicate<V> resultPredicate) | 對返回結果判斷,是否重試 |
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder() .retryIfException() .retryIfResult(Predicates.equalTo(false)) .withAttemptTimeLimiter(AttemptTimeLimiters.fixedTimeLimit(1, TimeUnit.SECONDS)) .withStopStrategy(StopStrategies.stopAfterAttempt(5)) .build();//Retryer調用 retryer.call(() -> true);復制代碼
作者:潛行前行
鏈接:https://juejin.cn/post/6974202216768864264
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。