亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

「Java 8 函數(shù)式編程」讀書筆記——流

qpwoeiru96 / 2959人閱讀

摘要:本文是函數(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;
Iterator iterator = 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è)例子說明:

Stream names = 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

相關(guān)文章

  • Java 8 函數(shù)編程讀書筆記——數(shù)據(jù)并行化

    摘要:限制編寫并行流,存在一些與非并行流不一樣的約定。底層框架并行流在底層沿用的框架,遞歸式的分解問題,然后每段并行執(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ā)...

    leone 評(píng)論0 收藏0
  • java 8 實(shí)戰(zhàn)》讀書筆記 -第四章 引入

    摘要:第四章引入流一什么是流流是的新成員,它允許你以聲明性方式處理數(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í)迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼。 下面兩段代碼都是用來返回低...

    jeyhan 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第六章讀書筆記(用收集數(shù)據(jù)-01)

    摘要:收集器用作高級(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...

    EscapedDog 評(píng)論0 收藏0
  • java 8 實(shí)戰(zhàn)》讀書筆記 -第十四章 函數(shù)編程的技巧

    摘要:但是,最好使用差異化的類型定義,函數(shù)簽名如下其實(shí)二者說的是同一件事。后者的返回值和初始函數(shù)的返回值相同,即。破壞式更新和函數(shù)式更新的比較三的延遲計(jì)算的設(shè)計(jì)者們?cè)趯⒁霑r(shí)采取了比較特殊的方式。四匹配模式語(yǔ)言中暫時(shí)并未提供這一特性,略。 一、無處不在的函數(shù) 一等函數(shù):能夠像普通變量一樣使用的函數(shù)稱為一等函數(shù)(first-class function)通過::操作符,你可以創(chuàng)建一個(gè)方法引用,...

    nemo 評(píng)論0 收藏0
  • Java 8 函數(shù)編程讀書筆記——lambda表達(dá)

    摘要:本文是函數(shù)式編程第二章的讀書筆記。的語(yǔ)法簡(jiǎn)化了使用匿名內(nèi)部類時(shí)的模板代碼,讓程序員專注于編寫想要執(zhí)行的行為,也讓代碼更加簡(jiǎn)潔易讀。中最重要的函數(shù)接口類型推斷為新成員表達(dá)式提供了類型推斷的支持,在不需要聲明參數(shù)類型的表達(dá)式中表現(xiàn)的有為明顯。 本文是「Java 8 函數(shù)式編程」第二章的讀書筆記。 Lambda引入的變化 Lambda表達(dá)式,是一種緊湊的、傳遞行為的方式,從編程思想上來講,...

    lx1036 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<