在編碼過程中构回,我們得到一個集合的數(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的同學:[張三, 李四]
、