Java8 Stream流讓代碼更高效狰域、整潔

在編碼過程中构回,我們得到一個集合的數(shù)據(jù),需要對集合中的某個字段進行提取遥赚,組合成新的集合扬舒,或者是按照集合中的某個字段進行排序,再或者是根據(jù)條件進行篩選凫佛。遇到這幾種場景讲坎,可能常規(guī)操作是循環(huán)迭代處理,在Java8中提供了可以進行內(nèi)部迭代的API愧薛,就是這次要說的Stream流晨炕,語句更簡潔高效。一個集合需要重新聚合毫炉、排序瓮栗、篩選操作是都可以一句搞定。

一瞄勾、用集合來舉例费奸,先創(chuàng)建一個集合

Student類有姓名、年齡进陡、性別三個屬性

public class Student{
       private String name;          
       private int age;
       private String sex;
      //getter 愿阐、setter、toString方法
}

集合添加三個數(shù)據(jù)趾疚,作為本次的測試數(shù)據(jù)

List<Student> listStu = new ArrayList<>();
Student student1 = new Student();
student1.setName("張三");
student1.setAge(18);
student1.setSex("男");
listStu.add(student1);

Student student2 = new Student();
student2.setName("李四");
student2.setAge(19);
student2.setSex("女");
listStu.add(student2);

Student student3 = new Student();
student3.setName("趙五");
student3.setAge(16);
student3.setSex("男");
listStu.add(student3);

二缨历、重新聚合

當需要將集合中所有的name收集起來組成一個新集合時,在JAVA8之前糙麦,可能會用循環(huán)再根據(jù)條件生成一個新的集合辛孵,現(xiàn)在用Stream流進行操作一下。

  • stream()方法是獲取集合的流
  • map() 方法用于映射每個元素到對應的結果
  • collect 將流轉為集合
List<String> names = listStu.stream().map(Student::getName).collect(Collectors.toList());
System.out.println("名字集合:"+names.toString());

運行結果:
名字集合:[張三, 李四, 趙五]

三赡磅、排序

當需要將集合按照年齡進行排序時魄缚,以前可能想到的是哪個排序算法比較好,現(xiàn)在不考慮這個問題了仆邓,試試用Steam流排序鲜滩。

List<Student> sortStu = listStu.stream().sorted(Comparator.comparingInt(Student::getAge).reversed()).collect(Collectors.toList());
System.out.println("根據(jù)年齡倒敘排列:"+sortStu);

運行結果:
根據(jù)年齡倒敘排列:[Student{name='李四', age=19, sex='女'}, Student{name='張三', age=18, sex='男'}, Student{name='趙五', age=16, sex='男'}]

四伴鳖、篩選

當需要將集合篩選出年齡大于17的同學時,以前可能就是循環(huán)然后按照條件篩選徙硅,JAVA8之后換這個方法試試榜聂。

List<Student> filterStu = listStu.stream().filter(s ->s.getAge() > 17).collect(Collectors.toList());
System.out.println("篩選年齡大于17的同學:"+filterStu.toString());

運行結果:
篩選年齡大于17的同學:[Student{name='張三', age=18, sex='男'}, Student{name='李四', age=19, sex='女'}]

五、舉一反三

當獲取到集合的流后嗓蘑,可以進行map须肆、sorted、filter方法處理桩皿,處理完成后再選擇輸出方式豌汇,得到想要的集合。舉例:當集合在篩選年齡大于17歲的同學后輸出所有名字的列表泄隔,下面看代碼拒贱。

List<String> filterStu = listStu.stream().filter(s ->s.getAge() > 17).map(Student::getName).collect(Collectors.toList());
System.out.println("篩選年齡大于17的同學:"+filterStu.toString());

運行結果:
篩選年齡大于17的同學:[張三, 李四]

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佛嬉,一起剝皮案震驚了整個濱河市逻澳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暖呕,老刑警劉巖斜做,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異湾揽,居然都是意外死亡瓤逼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門库物,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霸旗,“玉大人,你說我怎么就攤上這事艳狐《ㄏ酰” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵毫目,是天一觀的道長。 經(jīng)常有香客問我镀虐,道長,這世上最難降的妖魔是什么沟绪? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任刮便,我火速辦了婚禮,結果婚禮上绽慈,老公的妹妹穿的比我還像新娘恨旱。我一直安慰自己辈毯,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布搜贤。 她就那樣靜靜地躺著谆沃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仪芒。 梳的紋絲不亂的頭發(fā)上唁影,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音掂名,去河邊找鬼据沈。 笑死,一個胖子當著我的面吹牛饺蔑,可吹牛的內(nèi)容都是我干的锌介。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼猾警,長吁一口氣:“原來是場噩夢啊……” “哼掏湾!你這毒婦竟也來了?” 一聲冷哼從身側響起肿嘲,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤融击,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雳窟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尊浪,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年封救,在試婚紗的時候發(fā)現(xiàn)自己被綠了拇涤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡誉结,死狀恐怖鹅士,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惩坑,我是刑警寧澤掉盅,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站以舒,受9級特大地震影響趾痘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔓钟,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一永票、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦侣集、人聲如沸键俱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽编振。三九已至,卻和暖如春罚攀,著一層夾襖步出監(jiān)牢的瞬間党觅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工斋泄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杯瞻,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓炫掐,卻偏偏與公主長得像魁莉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子募胃,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359