Java中的集合轉(zhuǎn)換(lambda表達(dá)式)

文章作者:Tyan
博客:noahsnail.com

    在Java應(yīng)用中進(jìn)行集合對象間的轉(zhuǎn)換是非常常見的事情贞奋,有時候在處理某些任務(wù)時選擇一種好的數(shù)據(jù)結(jié)構(gòu)往往會起到事半功倍的作用,因此熟悉每種數(shù)據(jù)結(jié)構(gòu)并知道其特點對于程序員來說是非常重要的滴某,而只知道這些是不夠的斯棒,有時候你需要一個Map來處理數(shù)據(jù),而此時你手中只有一個List室叉,此時知道如何將List轉(zhuǎn)為Map就非常重要了,而只知道for循環(huán)將List轉(zhuǎn)為Map這就太Low了匙隔,JDK1.8 吸收了許多函數(shù)式編程的思想,其中的lambda表達(dá)式不僅功能強(qiáng)大,而且減少了很多不必要的代碼,本文不是介紹lambda表達(dá)式的害驹,主要是利用lambda表達(dá)式進(jìn)行Java中結(jié)合的轉(zhuǎn)換,當(dāng)然lambda表達(dá)式的使用往往離不開JDK1.8 的stream類蛤育,本文主要使用***lambda表達(dá)式***和***stream類***來實現(xiàn)Java中集合的轉(zhuǎn)換宛官,也會涉及到利用stream對數(shù)據(jù)進(jìn)行的一些處理。 

1.List To Map <==> Map To List

將List轉(zhuǎn)換為Map是Java中的常見操作瓦糕,例如我想知道某個對象是否已經(jīng)在List中底洗,此時就需要將List轉(zhuǎn)成Map,你總不會打算for循環(huán)一個個比吧咕娄!

@Data   //lombok提供的注解亥揖,會自動添加getter和setter
public class Student {
   private String id;
   private String name;
   private String info;
}

現(xiàn)在有一個所有學(xué)生信息的列表List<Student> list和一個要新添加的學(xué)生Student studentNew,在添加學(xué)生之前需要對新添加的學(xué)生信息studentNew進(jìn)行判斷是否已經(jīng)在list中谭胚,學(xué)生的唯一標(biāo)識是id徐块,不考慮其他,就是單純的用Java代碼判斷灾而,此時就需要將List轉(zhuǎn)為Map,代碼如下:

Map<String, Student> studentMap = list.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
if(studentMap.containsKey(studentNew.getId())) {
   System.out.println("studentNew in map!");
}

將Map轉(zhuǎn)為List就非常簡單了:

List<Student> listValues = new ArrayList<Student>(studentMap.values()); //map values
List<String> listKeys = new ArrayList<String>(studentMap.keySet()); //map keys  

2.List To Set <==> Set To List

List與Set之間的轉(zhuǎn)換就很容易了扳剿,Set To List:

Set<String> set = new HashSet<String>();
set.add("123");
set.add("456");
List<String> setToList = new ArrayList<String>(set); //Set To List

List To Set:

Set<String> listToSet = new HashSet<String>(listSet);

注:如果需要對List去重可以使用Set旁趟,這List To Set + Set To List兩個操作可以將List中的重復(fù)元素去掉。這里用的是HashSet庇绽,如果需要一個有序的List锡搜,可以選擇TreeSet,TreeSet需要實現(xiàn)對象的Comparable接口瞧掺。

3.Array To List <==> List To Array

參考:Java中List與Array的轉(zhuǎn)換
注:對Array的許多操作都可以先將Array轉(zhuǎn)為List耕餐,然后再進(jìn)行需要的轉(zhuǎn)換再進(jìn)行處理,或轉(zhuǎn)為List后使用Stream提供的操作來進(jìn)行處理辟狈。

4.Map To Set <==> Set To Map

Map與Set之間的轉(zhuǎn)換也比較簡單肠缔,Map To Set:

Set<String> mapToSetKeys = new HashSet<String>(studentMap.keySet()); //map keys
Set<Student> mapToSetValues = new HashSet<Student>(studentMap.values()); //map values

Set To Map:

Map<String, Student> setToMap = mapToSetValues.stream().collect(Collectors.toMap(Student::getId, Function.identity()));

5.List排序

要對List中的對象進(jìn)行排序以前非常麻煩夏跷,什么對象實現(xiàn)Comparable接口啊,寫一個StudentComparator實現(xiàn)Comparator接口呀明未,非常麻煩槽华,現(xiàn)在非常簡單一行代碼搞定(兩種方式):

list.sort(Comparator.comparing(Student::getName)); //按名字排序
list.sort((p1,p2) -> {
   return p1.getName().toLowerCase().compareTo(p2.getName().toLowerCase());
});//lambda表達(dá)式

6.stream中的filter功能

filter功能主要是對集合中的元素進(jìn)行過濾,以List為例趟妥,找出名字叫Jack的學(xué)生:

List<Student> filterResult = list.stream().filter(p -> StringUtils.equals(p.getName(), "Jack")).collect(Collectors.toList());
filterResult.stream().forEach(p -> {
   System.out.println(p.getName());
});

上面的代碼使用了stream的filter函數(shù)和forEach函數(shù)猫态,以后可以少寫for循環(huán)遍歷List了。filter的->后面需要返回一個boolean值披摄。最好"Jack"寫前面亲雪,習(xí)慣。
filter會對List中的每個元素進(jìn)行處理疚膊。

7.stream中的map功能

給每個學(xué)生的名字后面加上個China:

List<Student> mapResult = list.stream().map(p -> {
   p.setName(p.getName() + " China");
   return p;
}).collect(Collectors.toList());
mapResult.stream().forEach(p -> {
   System.out.println(p.getName());
});

map函數(shù)的主要功能是對List中的每個元素進(jìn)行處理并返回匆光,可以返回其它的數(shù)據(jù)類型,例如:

List<String> mapResult = list.stream().map(p -> {
p.setName(p.getName() + " China");
   return p.getName();
}).collect(Collectors.toList());
mapResult.stream().forEach(p -> {
   System.out.println(p);
});

8.filter和map結(jié)合起來用

找出名字為Jack的Student并在名字后面加上China:

List<Student> result = list.stream().filter(p -> StringUtils.equals("Jack", p.getName())).map(p -> {
   p.setName(p.getName() + " China");
   return p;
}).collect(Collectors.toList());
   result.stream().forEach(p -> {
   System.out.println(p.getName());
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酿联,一起剝皮案震驚了整個濱河市终息,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贞让,老刑警劉巖周崭,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喳张,居然都是意外死亡续镇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門销部,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摸航,“玉大人,你說我怎么就攤上這事舅桩〗椿ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵擂涛,是天一觀的道長读串。 經(jīng)常有香客問我,道長撒妈,這世上最難降的妖魔是什么恢暖? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮狰右,結(jié)果婚禮上杰捂,老公的妹妹穿的比我還像新娘。我一直安慰自己棋蚌,他們只是感情好嫁佳,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布挨队。 她就那樣靜靜地躺著,像睡著了一般脱拼。 火紅的嫁衣襯著肌膚如雪瞒瘸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天熄浓,我揣著相機(jī)與錄音情臭,去河邊找鬼。 笑死赌蔑,一個胖子當(dāng)著我的面吹牛俯在,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娃惯,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼跷乐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趾浅?” 一聲冷哼從身側(cè)響起愕提,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皿哨,沒想到半個月后浅侨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡证膨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年如输,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片央勒。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡不见,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出崔步,到底是詐尸還是另有隱情稳吮,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布刷晋,位于F島的核電站盖高,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眼虱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一席纽、第九天 我趴在偏房一處隱蔽的房頂上張望捏悬。 院中可真熱鬧,春花似錦润梯、人聲如沸过牙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寇钉。三九已至刀疙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扫倡,已是汗流浹背谦秧。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留撵溃,地道東北人疚鲤。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像缘挑,于是被迫代替她去往敵國和親集歇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理语淘,服務(wù)發(fā)現(xiàn)诲宇,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • Scala的集合類可以從三個維度進(jìn)行切分: 可變與不可變集合(Immutable and mutable coll...
    時待吾閱讀 5,807評論 0 4
  • 首頁 資訊 文章 資源 小組 相親 登錄 注冊 首頁 最新文章 IT 職場 前端 后端 移動端 數(shù)據(jù)庫 運(yùn)維 其他...
    Helen_Cat閱讀 3,850評論 1 10
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗惶翻。 張土汪:刷leetcod...
    土汪閱讀 12,740評論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法姑蓝,類相關(guān)的語法,內(nèi)部類的語法维贺,繼承相關(guān)的語法它掂,異常的語法,線程的語...
    子非魚_t_閱讀 31,599評論 18 399