在编码过程中,我们得到一个集合的数据,需要对集合中的某个字段进行提取,组合成新的集合,或者是按照集合中的某个字段进行排序,再或者是根据条件进行筛选。遇到这几种场景,可能常规操作是循环迭代处理,在Java8中提供了可以进行内部迭代的API,就是这次要说的Stream流,语句更简洁高效。一个集合需要重新聚合、排序、筛选操作是都可以一句搞定。
一、用集合来举例,先创建一个集合
Student类有姓名、年龄、性别三个属性
public class Student{
private String name;
private int age;
private String sex;
//getter 、setter、toString方法
}
集合添加三个数据,作为本次的测试数据
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之前,可能会用循环再根据条件生成一个新的集合,现在用Stream流进行操作一下。
- stream()方法是获取集合的流
- map() 方法用于映射每个元素到对应的结果
- collect 将流转为集合
List<String> names = listStu.stream().map(Student::getName).collect(Collectors.toList());
System.out.println("名字集合:"+names.toString());
运行结果:
名字集合:[张三, 李四, 赵五]
三、排序
当需要将集合按照年龄进行排序时,以前可能想到的是哪个排序算法比较好,现在不考虑这个问题了,试试用Steam流排序。
List<Student> sortStu = listStu.stream().sorted(Comparator.comparingInt(Student::getAge).reversed()).collect(Collectors.toList());
System.out.println("根据年龄倒叙排列:"+sortStu);
运行结果:
根据年龄倒叙排列:[Student{name='李四', age=19, sex='女'}, Student{name='张三', age=18, sex='男'}, Student{name='赵五', age=16, sex='男'}]
四、筛选
当需要将集合筛选出年龄大于17的同学时,以前可能就是循环然后按照条件筛选,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的同学:[张三, 李四]
、