Java8 Stream流让代码更高效、整洁

在编码过程中,我们得到一个集合的数据,需要对集合中的某个字段进行提取,组合成新的集合,或者是按照集合中的某个字段进行排序,再或者是根据条件进行筛选。遇到这几种场景,可能常规操作是循环迭代处理,在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的同学:[张三, 李四]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。