摘要:本文是函數(shù)式編程第三章的讀書筆記,章名為流。正確使用表達(dá)式明確要達(dá)成什么轉(zhuǎn)化,而不是說明如何轉(zhuǎn)化沒有副作用只通過函數(shù)的返回值就能充分理解函數(shù)的全部作用函數(shù)不會(huì)修改程序或外界的狀態(tài)獲取值而不是變量避免使用數(shù)組逃過的追殺,應(yīng)該考慮優(yōu)化邏輯
本文是「Java 8 函數(shù)式編程」第三章的讀書筆記,章名為流。本章主要介紹了外部迭代與內(nèi)部迭代以及常用的高階函數(shù)。
外部迭代與內(nèi)部迭代 外部迭代過去我們要對(duì)一個(gè)List進(jìn)行迭代時(shí),往往會(huì)采用如下方式:
int count = 0; for (Artist artist : artists) { if (artist.isFrom("London")) { count++; } }
而這種方法的原理,其實(shí)是先調(diào)用iterator方法,然后再迭代,等效于如下代碼:
int count = 0; Iteratoriterator = artists.iterator(); while (iterator.hasNext()) { Artist artist = iterator.next(); if (artist.isFrom("London")) { count++; } }
這樣的迭代方式,把迭代的控制權(quán)交給了iterator對(duì)象,讓其控制整個(gè)迭代過程,這就叫做外部迭代。
外部迭代需要我們自己編寫迭代的控制代碼,顯得十分繁瑣。特別是對(duì)于Map對(duì)象,繁瑣到我都不想給出例子。
外部迭代將行為和方法混為一談,難以對(duì)代碼進(jìn)行重構(gòu)操作。
內(nèi)部迭代與之相對(duì)的就是內(nèi)部迭代了。內(nèi)部迭代就是把迭代的控制權(quán)交給了集合本身,讓集合自己實(shí)現(xiàn)相應(yīng)的迭代,而調(diào)用者并不需要關(guān)心如何迭代。
要使用內(nèi)部迭代,需要使用Java 8中新增的接口Stream。而集合框架都已經(jīng)包含了一個(gè)stream()方法,用于獲得Stream對(duì)象。
long count = artists.stream() .filter(artist -> artist.isFrom("London")) .count();
這個(gè)例子就是使用的內(nèi)部迭代。先獲取stream對(duì)象,然后調(diào)用filter方法過濾,最后統(tǒng)計(jì)符合條件的個(gè)數(shù)。
實(shí)現(xiàn)機(jī)制在Java中調(diào)用一個(gè)方法,通常會(huì)立即執(zhí)行操作。然而Stream里的一些方法卻不太一樣,它們返回的對(duì)象不是新的集合,而是創(chuàng)建新集合的配方。我們通過一個(gè)例子說明:
Streamnames = Stream.of("Bryant", "Jordon", "James") .filter(name -> { System.out.println(name); return name.length() == 6; }); System.out.println("counting"); System.out.println(names.count());
最終會(huì)得到如下輸出:
counting Bryant Jordon James 2
出現(xiàn)這樣的結(jié)果,原因是
像filter這樣的方法,只會(huì)描述Stream,最終不會(huì)產(chǎn)生新集合的方法叫做惰性求值方法
像count這樣會(huì)從Stream中產(chǎn)生值或集合等結(jié)果的方法叫做及早求值方法
判斷一個(gè)操作是惰性求值還是及早求值,只需要看它的返回值
如果返回值是Stream,則是惰性求值
返回的是一個(gè)值或null,則是及早求值
在對(duì)集合使用流操作時(shí),使用惰性求值方法形成一個(gè)惰性求值的鏈,最后用及早求值方法得到結(jié)果,而集合只需要迭代一次。
常用流操作collect:及早求值,常用于生成List Map或其他復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
map:惰性求值,將一種類型的數(shù)據(jù)轉(zhuǎn)換成另一種類型,將一個(gè)流中的值轉(zhuǎn)化成一個(gè)新的流,類似于Hadoop里的map
filter:惰性求值,過濾不符合條件的元素
flatMap:惰性求值,類似于map,只是Function參數(shù)的返回值限定為Stream,用于連接多個(gè)Stream成為一個(gè)Stream
max & min:及早求值,reduce方法的特例,返回Optional(第四章介紹)對(duì)象
reduce:及早求值,從一組值中生成一個(gè)值,類似于Hadoop中的reduce
高階函數(shù)高階函數(shù)接收一個(gè)函數(shù)作為參數(shù),或者返回一個(gè)函數(shù)的函數(shù)。
正確使用Lambda表達(dá)式明確要達(dá)成什么轉(zhuǎn)化,而不是說明如何轉(zhuǎn)化
沒有副作用:
只通過函數(shù)的返回值就能充分理解函數(shù)的全部作用
函數(shù)不會(huì)修改程序或外界的狀態(tài)
獲取值而不是變量(避免使用數(shù)組逃過JVM的追殺,應(yīng)該考慮優(yōu)化邏輯)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66602.html
摘要:限制編寫并行流,存在一些與非并行流不一樣的約定。底層框架并行流在底層沿用的框架,遞歸式的分解問題,然后每段并行執(zhí)行,最終由合并結(jié)果,返回最后的值。 本書第六章的讀書筆記,也是我這個(gè)系列的最后一篇讀書筆記。后面7、8、9章分別講的測(cè)試、調(diào)試與重構(gòu)、設(shè)計(jì)和架構(gòu)的原則以及使用Lambda表達(dá)式編寫并發(fā)程序,因?yàn)楣P記不好整理,就不寫了,感興趣的同學(xué)自己買書來看吧。 并行化流操作 關(guān)于并行與并發(fā)...
摘要:第四章引入流一什么是流流是的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合通過查詢語(yǔ)句來表達(dá),而不是臨時(shí)編寫一個(gè)實(shí)現(xiàn)。 第四章 引入流 一、什么是流 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語(yǔ)句來表達(dá),而不是臨時(shí)編寫一個(gè)實(shí)現(xiàn))。就現(xiàn)在來說,你可以把它們看成遍歷數(shù)據(jù)集的高級(jí)迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼。 下面兩段代碼都是用來返回低...
摘要:收集器用作高級(jí)歸約剛剛的結(jié)論又引出了優(yōu)秀的函數(shù)式設(shè)計(jì)的另一個(gè)好處更易復(fù)合和重用。更具體地說,對(duì)流調(diào)用方法將對(duì)流中的元素觸發(fā)一個(gè)歸約操作由來參數(shù)化。另一個(gè)常見的返回單個(gè)值的歸約操作是對(duì)流中對(duì)象的一個(gè)數(shù)值字段求和。 用流收集數(shù)據(jù) 我們?cè)谇耙徽轮袑W(xué)到,流可以用類似于數(shù)據(jù)庫(kù)的操作幫助你處理集合。你可以把Java 8的流看作花哨又懶惰的數(shù)據(jù)集迭代器。它們支持兩種類型的操作:中間操作(如 filt...
摘要:但是,最好使用差異化的類型定義,函數(shù)簽名如下其實(shí)二者說的是同一件事。后者的返回值和初始函數(shù)的返回值相同,即。破壞式更新和函數(shù)式更新的比較三的延遲計(jì)算的設(shè)計(jì)者們?cè)趯⒁霑r(shí)采取了比較特殊的方式。四匹配模式語(yǔ)言中暫時(shí)并未提供這一特性,略。 一、無處不在的函數(shù) 一等函數(shù):能夠像普通變量一樣使用的函數(shù)稱為一等函數(shù)(first-class function)通過::操作符,你可以創(chuàng)建一個(gè)方法引用,...
摘要:本文是函數(shù)式編程第二章的讀書筆記。的語(yǔ)法簡(jiǎn)化了使用匿名內(nèi)部類時(shí)的模板代碼,讓程序員專注于編寫想要執(zhí)行的行為,也讓代碼更加簡(jiǎn)潔易讀。中最重要的函數(shù)接口類型推斷為新成員表達(dá)式提供了類型推斷的支持,在不需要聲明參數(shù)類型的表達(dá)式中表現(xiàn)的有為明顯。 本文是「Java 8 函數(shù)式編程」第二章的讀書筆記。 Lambda引入的變化 Lambda表達(dá)式,是一種緊湊的、傳遞行為的方式,從編程思想上來講,...
閱讀 1100·2021-10-11 10:59
閱讀 3684·2021-09-26 09:55
閱讀 944·2019-08-30 15:55
閱讀 2710·2019-08-30 15:44
閱讀 486·2019-08-30 14:06
閱讀 772·2019-08-30 11:26
閱讀 3399·2019-08-30 10:49
閱讀 2616·2019-08-29 12:53