项目中使用 java函数式编程_函数式编程在Java8中使用Lambda表达式进行开发
事情起因
如果不喜歡看故事的同學,請前往下一章節。
事情起因是我打算集成Redis緩存,配置了Redis以后,發現@Cacheable注解始終不生效,折騰了大半天以后,我的心態已經崩了,決定不使用@Cacheable注解了,自己來設置緩存和讀取緩存,當然這篇文章的主題是Lambda表達式,所以緩存的問題一筆帶過。在自己獲取緩存和設置緩存的時候,發現大量重復的代碼,都是一樣的if判斷語句,所以決定寫一個通用的方法把重復的代碼干掉,就想到了可以使用函數式編程,Lambda表達式可以精簡代碼,就分享給大家一下作為參考。
什么是Lambda表達式
Lambda表達式推動Java8發布的最重要新特性。Lambda表達式允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。所以你必須升級到 JDK8 以上才可以使用Lambda表達式,如果是 JDK7 的同學就無緣Lambda表達式了。
Lambda表達式的格式
(parameters) -> expression 或 (parameters) ->{ statements; }
圓括號中的參數可以不寫類型,編譯器可以統一識別參數值;大括號呢在只有一句的情況下可以省略掉大括號
開始使用Lambda表達式
第一步,需要先定義一個函數式接口,例如
?
1
2
3
4
@FunctionalInterface
public
interface
IFunctionObject?{
Object?function();
}
所謂的函數式接口,首先是接口,然后就是在這個接口里面只能有一個抽象方法。也稱為SAM(Single Abstract Method interfaces)接口。注解@FunctionalInterface用于編譯檢查,如果不符合函數式接口在編譯時就會報錯,是一個錯誤檢查的功能。
第二步,在具體業務邏輯中調用函數式接口,例如
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
*?從緩存中獲取對象,如果沒有則運行對象獲取接口放入緩存
*
*?@param?key????????????H
*?@param?hashKey????????HK
*?@param?functionObject?對象獲取接口
*?@return?對象
*/
protected?Object?cacheGet(String?key,
String?hashKey,
IFunctionObject?functionObject)?{
Object?object?=
null
;
try
{
//從緩存中獲取對象
object?=?redisTemplate.opsForHash()
.get(key,?hashKey);
if
(object?==
null
)?{
//沒有獲取到對象,運行對象獲取接口放入緩存
object?=?functionObject.function();
if?(object?!=null?&&
objectinstanceof?Serializable)
cacheSetHash(key,?hashKey,?object);
}
}
catch
(Exception?e)?{
log.error(e.getMessage(),?e);
}
return
object;
}
第三步,使用Lambda表達式調用我們的業務代碼,例如:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
*?根據ID獲取文章
*
*?@param?id?ID編號
*?@return?文章
*/
public
Article?getArticleById(Long?id)?{
//先從緩存中獲取,如果沒有就從數據庫中獲取
Article?article?=?(Article)
cacheGet("article",?id.toString(),
()?->?articleMapper.selectByPrimaryKey(id));
//拿到以后,瀏覽量加一
if
(article?!=
null
)?{
setViewAdd(id);
}
return
article;
}
其他函數式接口使用舉例:下面的方法都可以使用Lambda表達式調用
java.lang.Runnable,
java.awt.event.ActionListener,
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的接口,如Consumer、Predicate、Supplier等
總結
說一下我的理解,Lambda表達式其實就是一個匿名函數,而這個函數可以當做一個參數在方法間傳遞,可以把函數式接口理解為一個Class類型,Lambda表達式就是這個類型的變量,只不過這個變量比較特殊,他可以運行一些邏輯以后返回結果
總結
以上是生活随笔為你收集整理的项目中使用 java函数式编程_函数式编程在Java8中使用Lambda表达式进行开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斯坦福、伯克利新研究推翻谷歌「量子霸权」
- 下一篇: 2022年银行存款利率表一览表 有以下6