摘要:前言由于這段時(shí)間使用的原因,很多東西都用了內(nèi)部的來做,也沒關(guān)心底層怎么操作的。首先,我們看下這個(gè)內(nèi)置的函數(shù)式接口中的方法,解釋為將給定的參數(shù)應(yīng)用于該函數(shù)。開始愉快的編碼吧。本文代碼裝了逼趕緊逃。
前言
由于這段時(shí)間使用SpringBoot的原因,很多東西都用了SpringBoot內(nèi)部的Template來做,也沒關(guān)心底層怎么操作的。最近忙里偷閑回答了幾個(gè)問題,正巧看到一個(gè)關(guān)于Redis資源釋放問題的,引起了我的興趣,便去看了下官方文檔。
Redis推薦的Java客戶端是jedis,關(guān)于Jedis的配置那些我就不說了,直接上他的示例代碼
You use it by:
/// Jedis implements Closeable. Hence, the jedis instance will be auto-closed after the last statement. try (Jedis jedis = pool.getResource()) { /// ... do stuff here ... for example jedis.set("foo", "bar"); String foobar = jedis.get("foo"); jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); Setsose = jedis.zrange("sose", 0, -1); } /// ... when closing your application: pool.destroy(); If you can"t use try-with-resource, you can still enjoy with Jedis.close().
Jedis jedis = null; try { jedis = pool.getResource(); /// ... do stuff here ... for example jedis.set("foo", "bar"); String foobar = jedis.get("foo"); jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); Setsose = jedis.zrange("sose", 0, -1); } finally { // You have to close jedis object. If you don"t close then // it doesn"t release back to pool and you can"t get a new // resource from pool. if (jedis != null) { jedis.close(); } } /// ... when closing your application: pool.destroy(); If Jedis was borrowed from pool, it will be returned to pool with
proper method since it already determines there was
JedisConnectionException occurred. If Jedis wasn"t borrowed from pool,
it will be disconnected and closed.
也就是說要么用Java7的try-with-resource關(guān)閉資源,要么就try finally。
唉,又該有人吐槽Java又臭又長了,像老太婆的裹腳布一樣。
怎么辦呢?
我們可以寫一個(gè)方法把所有的redis操作包裝起來,里面加上資源釋放。
呃?工程量好像有點(diǎn)大,而且沒逼格。。。
想啊想啊想,能不能在執(zhí)行Jedis方法的時(shí)候加上我們的代碼呢?比如在之前獲取連接池中的實(shí)例,在之后釋放資源。
咦,好像aop可以實(shí)現(xiàn)啊。
但是我就想用Java8的Lambda裝裝逼。
首先,我們看下這個(gè)Java內(nèi)置的函數(shù)式接口中的apply方法,解釋為“將給定的參數(shù)應(yīng)用于該函數(shù)”。
可以,正是我們需要的。
開始愉快的編碼吧。
創(chuàng)建一個(gè)Maven工程,指定編譯版本和運(yùn)行版本為jdk1.8,加入jedis依賴。
第二步:編寫Jedis配置類。
import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class RedisConf { private static JedisPool pool; private RedisConf(){} static { pool = new JedisPool(new JedisPoolConfig(), "192.168.100.15",6379,60000,"密碼手動打碼",13); } public static JedisPool getJedisPool() { return pool; } }第三步:
編寫執(zhí)行器
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import java.util.function.Function; public class RedisActuator { private JedisPool jedisPool = RedisConf.getJedisPool(); public第四步:R execute(Function fun) { try (Jedis jedis = jedisPool.getResource()){ return fun.apply(jedis); } catch (Exception e) { e.printStackTrace(); } return null; } }
編寫測試代碼(Jedis官方文檔中的示例代碼)
import com.fanxian.redis.RedisActuator; import java.util.Set; public class App { public static void main( String[] args ) { RedisActuator redisActuator = new RedisActuator(); redisActuator.execute(jedis -> jedis.set("foo", "bar")); String foobar = redisActuator.execute(jedis -> jedis.get("foo")); System.out.println(foobar); redisActuator.execute(jedis -> jedis.zadd("sose", 0, "car")); redisActuator.execute(jedis -> jedis.zadd("sose", 0, "bike")); Setsose = redisActuator.execute(jedis -> jedis.zrange("sose", 0, -1)); System.out.println(sose); } }
好像代碼也沒簡化多少。
本文代碼
:( 裝了逼趕緊逃。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67977.html
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達(dá)式改進(jìn)后或者是不得不承認(rèn),代碼看起來跟清晰了。這是由泛型接口內(nèi)部實(shí)現(xiàn)方式造成的。 # Lambda表達(dá)式在《Java8實(shí)戰(zhàn)》中第三章主要講的是Lambda表達(dá)式,在上一章節(jié)的筆記中我們利用了行為參數(shù)化來因?qū)Σ粩嘧兓男枨螅詈笪覀円彩褂玫搅薒ambda,通過表達(dá)式為我們簡化了很多代碼從而極大地提高了我們的...
摘要:歐陽思海繼承接口后,又加了新的抽象方法,這個(gè)接口就不再是函數(shù)式接口默認(rèn)方法在接口中添加了一個(gè)默認(rèn)方法??偨Y(jié)在這篇文章中,我們講了表達(dá)式方法引用函數(shù)式接口接口中的靜態(tài)方法接口中的默認(rèn)方法的使用。 今天我來聊聊 Java8 的一些新的特性,確實(shí) Java8 的新特性的出現(xiàn),給開發(fā)者帶來了非常大的便利,可能剛剛開始的時(shí)候會有點(diǎn)不習(xí)慣的這種寫法,但是,當(dāng)你真正的熟悉了之后,你一定會愛上這些新的...
摘要:上一篇小樂介紹了新特性函數(shù)式接口,大家可以點(diǎn)擊回顧。中引入方法引用新特性用于簡化應(yīng)用對象方法的調(diào)用,方法引用是用來直接訪問類或者實(shí)例的已經(jīng)存在的方法或者構(gòu)造方法。方法引用是一種更簡潔易懂的表達(dá)式。 上一篇小樂介紹了《Java8新特性-函數(shù)式接口》,大家可以點(diǎn)擊回顧。這篇文章將接著介紹Java8新特性之方法引用。 Java8 中引入方法引用新特性,用于簡化應(yīng)用對象方法的調(diào)用,?方法引用是...
摘要:上下文比如,接受它傳遞的方法的參數(shù),或者接受它的值得局部變量中表達(dá)式需要類型稱為目標(biāo)類型。但局部變量必須顯示的聲明,或?qū)嶋H上就算。換句話說,表達(dá)式只能捕獲指派給它們的局部變量一次。注捕獲實(shí)例變量可以被看作捕獲最終局部變量。 由于第三章的內(nèi)容比較多,而且為了讓大家更好的了解Lambda表達(dá)式的使用,也寫了一些相關(guān)的實(shí)例,可以在Github或者碼云上拉取讀書筆記的代碼進(jìn)行參考。 類型檢查、...
摘要:寫在前面最近在看實(shí)戰(zhàn)感覺這本書的排版紙質(zhì)內(nèi)容真的都超級棒個(gè)人覺得這本書還是很值得一讀本文簡單或詳細(xì)介紹一下的和表達(dá)式函數(shù)式接口是在才開始引入的首先看一下普通接口和函數(shù)式接口的區(qū)別普通接口指的是一些具有相同屬性和行為的類的抽象函數(shù)式接口也是同 寫在前面: 最近在看,感覺這本書的排版,紙質(zhì),內(nèi)容真的都超級棒,個(gè)人覺得這本書還是很值得一讀.本文簡單或詳細(xì)介紹一下Java8的Functiona...
閱讀 2303·2021-11-24 09:38
閱讀 2168·2021-11-22 14:44
閱讀 1162·2021-07-29 13:48
閱讀 2622·2019-08-29 13:20
閱讀 1123·2019-08-29 11:08
閱讀 2065·2019-08-26 10:58
閱讀 1270·2019-08-26 10:55
閱讀 3165·2019-08-26 10:39