Java 8 Lambda 和函數(shù)式編程

Java 8中比較大的改變就是引入了Lambda 表達(dá)式和Stream API凸克,這使得Java可以進(jìn)行函數(shù)式編程(functional programming)议蟆。

1. 什么是函數(shù)式編程

函數(shù)式編程和面向?qū)ο缶幊獭⒚嫦蜻^程編程一樣萎战,都是一種如何編程的方法論咐容,它主要的思想是函數(shù)是“第一等公民”,和其他數(shù)據(jù)類型一樣蚂维,可以被賦值和傳遞戳粒。函數(shù)式編程具有代碼簡潔,易于理解虫啥,易于"并發(fā)編程"等優(yōu)點(diǎn)蔚约。關(guān)于它的簡單介紹,可以參見函數(shù)式編程初探涂籽。

2. 什么是Lambda 表達(dá)式

An expression with parameter variables has been called a lambda expression. --- From Core Java Volume I--Fundamentals (10th Edition)

從上面的定義可以知道苹祟,帶有參數(shù)的表達(dá)式就是lambda 表達(dá)式。例如(String first, String second) -> first.length() - second.length()就是一個(gè)lambda 表達(dá)式又活。下面我們介紹Java中的lambda 表達(dá)式苔咪。

2.1 問題

public interface ActionListener {
  void actionPerformed(ActionEvent e);
}
button.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    ui.dazzle(e.getModifiers());
  }
});

上面的代碼使用了匿名類,但匿名類具有冗余的語法柳骄,不夠簡潔团赏,存在“高度問題”。能不能讓代碼更加簡單易讀耐薯?

2.2 解決辦法

通過觀察我們發(fā)現(xiàn)舔清,ActionListener只有一個(gè)抽象方法丝里,我們把只有一個(gè)抽象方法的接口叫做函數(shù)式接口(functional interface),這時(shí)你就可以使用Lambda 表達(dá)式体谒。因而我們可以把代碼簡化為:

button.addActionListener(e -> ui.dazzle(e.getModifiers()));

代碼看起來簡潔多了杯聚。你會發(fā)現(xiàn)Lambda 表達(dá)式并不是很玄的東西,不過是讓代碼看起來更加簡潔的語法糖而已抒痒。

2.3 方法引用(method reference)

有時(shí)幌绍,已經(jīng)有一個(gè)方法做了你期望做的事,這時(shí)我們可以用另一個(gè)語法來進(jìn)一步簡化代碼故响。

// 使用范例
object::instanceMethod
Class::staticMethod
Class::instanceMethod

Timer t = new Timer(1000, event -> System.out.println(event));
Timer t = new Timer(1000, System.out::println);
上面兩種寫法是同等的傀广。System.out::println是方法引用,等同于lambda表達(dá)式x -> System.out.println(x)彩届。
另一個(gè)例子:String::compareToIgnoreCase 等價(jià)于(x, y) -> x.compareToIgnoreCase(y)

3. Stream API

為了能夠進(jìn)行函數(shù)式編程伪冰,光有Lambda 表達(dá)式這個(gè)語法糖是不行的,因而Java 8 又提供了Stream API樟蠕,這是一個(gè)非常重大的更新贮聂,可以用函數(shù)式編程的思想方便地實(shí)現(xiàn)對集合(collections)的各種操作。掌握Stream API需要不斷實(shí)踐寨辩,可以網(wǎng)上查閱這些API的用法吓懈,本文對此不再展開,下面是一些例子捣染。

shapes.stream()
      .filter(s -> s.getColor() == BLUE)
      .forEach(s -> s.setColor(RED));
List<Shape> blue = shapes.stream()
                         .filter(s -> s.getColor() == BLUE)
                         .collect(Collectors.toList());
Set<Box> hasBlueShape = shapes.stream()
                              .filter(s -> s.getColor() == BLUE)
                              .map(s -> s.getContainingBox())
                              .collect(Collectors.toSet());
int sum = shapes.stream()
                .filter(s -> s.getColor() == BLUE)
                .mapToInt(s -> s.getWeight())
                .sum();

寫在最后

技術(shù)的核心思想一般都是簡單和通俗易懂的骄瓣,別被它花哨的名詞唬住了,互聯(lián)網(wǎng)擅長制造概念耍攘。當(dāng)然由于水平有限榕栏,如果有什么不對的地方,也歡迎大家指正蕾各。

Reference:
1.Core Java Volume I--Fundamentals (10th Edition) Cay S. Horstmann
2.http://www.cnblogs.com/figure9/p/java-8-lambdas-insideout-language-features.html
3.http://ju.outofmemory.cn/entry/104364

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扒磁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子式曲,更是在濱河造成了極大的恐慌妨托,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吝羞,死亡現(xiàn)場離奇詭異兰伤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钧排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門敦腔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恨溜,你說我怎么就攤上這事符衔≌仪埃” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵判族,是天一觀的道長躺盛。 經(jīng)常有香客問我,道長形帮,這世上最難降的妖魔是什么槽惫? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮沃缘,結(jié)果婚禮上躯枢,老公的妹妹穿的比我還像新娘。我一直安慰自己槐臀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布氓仲。 她就那樣靜靜地躺著水慨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敬扛。 梳的紋絲不亂的頭發(fā)上晰洒,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音啥箭,去河邊找鬼谍珊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛急侥,可吹牛的內(nèi)容都是我干的砌滞。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼坏怪,長吁一口氣:“原來是場噩夢啊……” “哼贝润!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铝宵,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤打掘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹏秋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尊蚁,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年侣夷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了横朋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜纸,死狀恐怖叶撒,靈堂內(nèi)的尸體忽然破棺而出绝骚,到底是詐尸還是另有隱情,我是刑警寧澤祠够,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布压汪,位于F島的核電站,受9級特大地震影響古瓤,放射性物質(zhì)發(fā)生泄漏止剖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一落君、第九天 我趴在偏房一處隱蔽的房頂上張望穿香。 院中可真熱鬧,春花似錦绎速、人聲如沸皮获。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洒宝。三九已至,卻和暖如春萌京,著一層夾襖步出監(jiān)牢的瞬間雁歌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工知残, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靠瞎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓求妹,卻偏偏與公主長得像乏盐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子扒最,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容