亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java函數式編程(三):列表的轉化

2019-11-26 15:24:39
字體:
來源:轉載
供稿:網友

列表的轉化

將集合轉化成一個新的集合就和遍歷它一樣簡單。假設我們要將列表中的名字轉化成全大寫的。我們看下都有哪些實現方式。

Java中的字符串是不可變的,所以它沒法改變。我們可以生成新的字符串,用來替換列表中原有的元素。然而這樣做的話,原來列表就沒了;還有一個問題,原來的列表可能也是不可變的,比如Arrays.asList()生成的,所以修改原來的列表這招不行。還有一個缺點就是這樣做很難并行操作。

生成一個新的全大寫的列表是個不錯的選擇。

乍聽起來這個建議弱爆了;性能是我們都很關注的一個問題。令人吃驚的是,函數式編程通常要比命令式的性能要高,我們在153頁的性能問題中會講到。

我們先開始用這個集合生成一個大寫字母的新集合吧。

復制代碼 代碼如下:

final List<String> uppercaseNames = new ArrayList<String>();
for(String name : friends) {
uppercaseNames.add(name.toUpperCase());
}

在命令式的代碼中,我們先創建一個空列表,然后把大寫的名字填充進去,在遍歷原來列表的過程中,每次插入一個。為了改進成函數式的版本,我們第一步可以考慮采用19頁遍歷列表中提到的那個內部迭代器forEach來替換一下for循環,正如下例所示的那樣。
復制代碼 代碼如下:

final List<String> uppercaseNames = new ArrayList<String>();
friends.forEach(name -> uppercaseNames.add(name.toUpperCase()));
System.out.println(uppercaseNames);

我們用了內部迭代器,但還得新建一個列表,然后再把元素插入到里面。我們還可以進一步改進。

使用lambda表達式

一個新引入的Stream接口里面,有個map方法,它可以幫助我們遠離可變性,并使代碼看起來更簡潔。Steam有點像集合的迭代器,同時它還提供了流函數(fluent functions)的功能。使用這個接口的方法,我們可以把一系列調用給組合起來,使代碼讀起來就像描述問題的順序一樣,可讀性更強。

Steam的map方法可以用來將輸入序列轉化成一個輸出的序列――這和我們要做的工作非常匹配。

復制代碼 代碼如下:

friends.stream()
.map(name -> name.toUpperCase())
.forEach(name -> System.out.print(name + " "));
System.out.println();

JDK8中的所有集合都支持這個stream方法,它把集合封裝成一個Steam實例。map方法對Stream中的每個元素都調用了指定的lambda表達式或者代碼塊。map方法跟forEach方法很不一樣, forEach只是簡單的對集合中的元素執行了一下指定的函數。而map方法把lambda表達式的運行結果收齊起來,返回一個結果集。最后我們用forEach方法打印了所有的元素。

新集合中的名字全都是大寫的了:

復制代碼 代碼如下:

BRIAN NATE NEAL RAJU SARA SCOTT

map方法很適合把一個輸入集合轉化成一個新的輸出集合。這個方法確保了輸入輸出序列的元素的數量是相同的。然而輸入元素和輸出元素的類型可以是不一樣的。在這個例子中,我們輸入和輸出的都是字符串的集合。我們可以傳給map方法一段代碼,讓它返回比如說名字中包含字符的個數。這樣的話,輸入的還是字符串的序列,而輸出的卻是數字序列了,就像下面這樣。

復制代碼 代碼如下:

friends.stream()
.map(name -> name.length())
.forEach(count -> System.out.print(count + " "));

結果是每個名字中字母的個數:
復制代碼 代碼如下:

5 4 4 4 4 5

使用了lambda表達式的之后版本,避免了顯式的修改操作;這樣的代碼非常簡潔。這樣寫不再需要初始化空的集合以及那個垃圾變量了;這個變量乖乖的躲到了底層實現里面了。

使用方法引用

我們還可以使用方法引用讓它變得更簡潔一些。在需要傳入函數式接口的實現的地方,Java編譯器可以接受lambda表達式或者是方法引用。有了這個特性,用String::toUpperCase就可以替換掉name -> name.toUpperCase()了,就像這樣:

復制代碼 代碼如下:

friends.stream()
.map(String::toUpperCase)
.forEach(name -> System.out.println(name));

當參數傳入到這個生成的方法――函數式接口的抽象方法的實現――里面的時候,Java會去調用這個String參數的toUpperCase方法。這個參數引用在這里就隱藏起來了。像前面這種簡單的場景,我們可以用方法引用來替換掉lambda表達式;更多的內容看一下26頁的什么時候應該使用方法引用。

復制代碼 代碼如下:

小伙伴發問了:
什么時候應該使用方法引用?

當使用Java編程的時候,通常我們用lambda表達式的時候要比方法引用多得多。但這并不意味著方法引用不重要或者沒啥用處。當lambda表達式非常簡短的時候,它是一個很好的替代方案,它直接調用了實例方法或者靜態方法。也就是說,如果lambda表達式只是傳遞了一下參數給方法調用的話,我們應該改用方法引用。
像這樣的lambda表達式,有點像Tom Smykowski在電影上班一條蟲中講的那樣,它的工作就是"從客戶那把需求拿給軟件工程師"。因為這個,我把這種重構成方法引用的模式叫做上班一條蟲模式。
除了簡潔外,使用方法引用,方法名字本身的含義和作用可以更好的體現出來。
使用方法引用背后,編譯器起到了很關鍵的作用。方法引用的目標對象和參數都會從這個生成的方法里傳進來的參數那推導出來。這才使得你可以使用方法引用寫出比使用lambda表達式更簡潔的代碼。不過,如果參數在傳遞給方法之前或者調用結果在返回之后要被修改的話,這種便利的寫法我們就用不了了。

在前面這個例子中,方法引用是引用了一個實例方法。方法引用還可以引用一個靜態方法以及接受傳參的方法。后面我們會看到這樣的例子。

lambda表達式能幫助我們遍歷集合,并且進行集合的轉化。就像下面我們即將看到的,它還能幫助我們快速的從集合中選取一個元素。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
奇米4444一区二区三区| 国产一区二区丝袜| 亚洲一品av免费观看| 69久久夜色精品国产69乱青草| 国产999精品久久久| 精品国偷自产在线| 5278欧美一区二区三区| 日本午夜在线亚洲.国产| 日本精品一区二区三区在线播放视频| 国产免费一区二区三区香蕉精| 亚洲天堂影视av| 日本精品视频在线观看| 亚洲福利影片在线| 亚洲精品一区二区三区婷婷月| 色婷婷久久一区二区| 欧美亚洲视频在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品999999| 亚洲欧美日本伦理| 高清日韩电视剧大全免费播放在线观看| 日本亚洲欧美成人| 久久久精品电影| 精品国产区一区二区三区在线观看| 不卡av电影在线观看| 97香蕉超级碰碰久久免费的优势| 精品久久久久久| 日韩电视剧在线观看免费网站| 在线免费观看羞羞视频一区二区| 精品亚洲夜色av98在线观看| 亚洲精品久久久久国产| 久久视频精品在线| 国产xxx69麻豆国语对白| 亚洲欧美激情在线视频| 91在线免费视频| 亚洲三级av在线| 亚洲国产99精品国自产| 日韩成人中文字幕在线观看| 久久精品国产欧美激情| 91国自产精品中文字幕亚洲| 久久久久国色av免费观看性色| 国产日本欧美一区二区三区| 性欧美暴力猛交69hd| 国产91精品黑色丝袜高跟鞋| 久久久久久久91| 精品国产91久久久久久老师| 国产精品嫩草影院一区二区| 亚洲二区在线播放视频| 亚洲第一福利网站| 国产日本欧美一区二区三区| 国产精品美女久久久久av超清| 一本大道香蕉久在线播放29| 久久久久久国产免费| 97成人精品区在线播放| 国内伊人久久久久久网站视频| 日韩在线播放一区| 日韩在线视频观看| 最好看的2019的中文字幕视频| 日本高清久久天堂| 日韩福利在线播放| 欧美视频在线免费看| 在线成人激情视频| 日韩电影视频免费| 精品国产一区二区三区久久久| 亚洲人成电影网站色xx| 亚洲成色777777在线观看影院| 欧美成人h版在线观看| 亚洲午夜女主播在线直播| 亚洲精品久久在线| 久久久久久尹人网香蕉| 最新国产精品亚洲| 欧美日韩美女在线| 国产噜噜噜噜久久久久久久久| 国产精品久久久| 欧美一区在线直播| 日韩精品免费视频| 日韩免费在线播放| 91精品久久久久久久久久| 色中色综合影院手机版在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 91久久精品美女| 欧美亚洲国产另类| 亚洲精品国产成人| 精品国产户外野外| 久久精品国产视频| 亚洲人成毛片在线播放| 亚洲网站在线观看| 亚洲精品久久久久中文字幕欢迎你| 欧洲日本亚洲国产区| 伊人亚洲福利一区二区三区| 91在线视频免费| 精品国产一区二区三区久久久狼| 91天堂在线观看| 国产日本欧美在线观看| 中文字幕久久久av一区| 日韩在线免费观看视频| 亚洲社区在线观看| 欧美日本在线视频中文字字幕| 亚洲女人被黑人巨大进入al| 日韩精品在线观看一区二区| 国产精品美女久久久久久免费| 国产一区二区三区高清在线观看| 国产91精品久久久久| 国产视频精品va久久久久久| 亚洲欧美日韩在线一区| 久久99久久99精品中文字幕| 久久精品人人做人人爽| 热门国产精品亚洲第一区在线| 国产成人福利网站| 欧美成人免费va影院高清| 九色精品美女在线| 91精品免费看| 欧美激情精品久久久久久黑人| 午夜精品一区二区三区视频免费看| 中文字幕精品www乱入免费视频| 亚洲va欧美va国产综合剧情| 成人在线精品视频| 日韩专区在线观看| 国产精品美女午夜av| 91精品视频在线看| 91美女片黄在线观看游戏| 国产精品xxxxx| 亚洲国产日韩欧美在线动漫| 日本亚洲欧美成人| 一区二区三区回区在观看免费视频| 国产视频欧美视频| 国产精品美女呻吟| 色婷婷av一区二区三区在线观看| 一区二区三区高清国产| 亚洲国产成人爱av在线播放| 久久久久久久成人| 92看片淫黄大片欧美看国产片| 亚洲国产高潮在线观看| 欧美国产高跟鞋裸体秀xxxhd| 日韩av电影在线免费播放| 伊人青青综合网站| 国产91精品视频在线观看| 欧美放荡办公室videos4k| 久久精品亚洲94久久精品| 在线视频国产日韩| 国产成人精品免高潮在线观看| 国内精品伊人久久| 欧美亚洲另类视频| 欧美成人全部免费| 亚洲成人激情在线| 欧美一级大片在线免费观看| 91精品国产成人| 精品国产成人av| 国产一区二区久久精品| 91精品综合久久久久久五月天| 久久影院在线观看| 最新国产精品亚洲| 日韩中文字幕视频在线| 国产精品视频色| 欧美日韩国产成人在线| 亚洲精品第一页| 日韩av在线最新| 91午夜在线播放| 国产精品吊钟奶在线| 欧美在线视频一区二区| 成人伊人精品色xxxx视频| 亚洲精品白浆高清久久久久久| 久久久99久久精品女同性| 日韩中文在线观看| 成人午夜黄色影院|