使用stream流筛选集合中的数据
使用传统的方式来筛选集合中的元素,我们可以想象到的方式就是遍历集合,将符合条件的元素存入一个新的集合中,或者将不符合的元素从集合中剔除。可是如果一旦筛选条件不止一个的时候,就会发现这种处理方式很繁琐,所以这个时候可以考虑使用jdk8的新特性,流式操作,再配合上lambda表达式和函数引用来简化代码的书写
常用方法
- 终结方法:返回值类型不再是
Stream
接口自身类型的方法,因此不再支持链式调用
- forEach 逐一处理
- count 统计流中元素个数
- collect 将流转换为单列集合
- toArray 将流转换为数组
- 延迟方法:返回值类型仍然是
Stream
接口自身类型的方法
- filter 过滤筛选
- limit 只取流中的前几个
- skip 跳过流中的前几个
- concat 合并两个流
- map 改变流中数据的数据类型
- 注意:一个流的操作一定要有终结方法,可以没有非终结方法;创建一个流,只能使用一次,对流中的数据进行操作不会影响原来集合中的元素
具体的演示案例
/**
* 这是往集合中存储的对象类
*/
public class Student {
/**
* 主键
*/
private Integer id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 性别
*/
private String gender;
public Student() {
}
public Student(Integer id, String name, Integer age, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
public void test(){
// 创建一个集合,存放对象元素
List<Student> studentList = new ArrayList<>();
// 创建Student对象
Student stu1 = new Student(1,"zs",18,"男");
Student stu2 = new Student(2,"ls",21,"男");
Student stu3 = new Student(3,"ww",25,"男");
Student stu4 = new Student(4,"xh",18,"女");
Student stu5 = new Student(5,"xl",20,"女");
Student stu6 = new Student(6,"zl",16,"男");
Student stu7 = new Student(7,"lh",22,"男");
Student stu8 = new Student(8,"yf",18,"女");
Student stu9 = new Student(9,"yg",30,"男");
Student stu10 = new Student(10,"lls",14,"男");
// 往集合中添加数据
studentList.add(stu1);
studentList.add(stu2);
studentList.add(stu3);
studentList.add(stu4);
studentList.add(stu5);
studentList.add(stu6);
studentList.add(stu7);
studentList.add(stu8);
studentList.add(stu9);
studentList.add(stu10);
// 去集合中的钱8个数据,并且要求把年龄大于20岁的男性的id存储到一个新的集合中
// 获取流
Stream<Student> stream = studentList.stream();
// lambda表达式筛选出取前8个 年龄大于20岁
List<Integer> idList = stream.limit(8).filter(stu -> stu.getAge() > 20)
// lambda表达式筛选出男性
.filter(stu -> "男".equals(stu.getGender()))
// 使用方法引用获取id
.map(Student::getId).collect(Collectors.toList());
System.out.println(idList);
}
使用流配合上lambda表达式以及函数引用,可以极大的简化代码,并且提高处理速度
版权声明:本文为zhizong123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。