Stream流
在JAVA8中添加Stream,这个真的是一个好东西。学习使用Stream会有效提高开发效率。究竟流有什么用呢?简单来说就是从数据源当中处理操作并输元素序列的一个东西,好像说得不太好。来段代码看看吧!我们有一个列表,里面筛选出女同学放到另外一个列表当中,以前我们是这样做的。
先给出一个实体Student类(这个实体类会在例子当中使用)
public class Student {
public static final int GENDER_FEMALE = 0;
public static final int GENDER_MALE = 1;
private String name;
private int age;
private int gender;
private String className;
public Student() {
}
public Student(String name, int age, int gender, String className) {
this.name = name;
this.age = age;
this.gender = gender;
this.className = className;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
按照原定计划,通过旧的代码筛选出女同学。不过在输出我也偷懒了一下用了stream来打印输出,不过具体怎么写我后面会说到。
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("Jason", 18, Student.GENDER_MALE, "ClassA"));
studentList.add(new Student("May", 17, Student.GENDER_FEMALE, "ClassB"));
studentList.add(new Student("Angelia", 18, Student.GENDER_FEMALE, "ClassB"));
studentList.add(new Student("Alisa", 16, Student.GENDER_FEMALE, "ClassA"));
studentList.add(new Student("Aimee", 16, Student.GENDER_FEMALE, "ClassA"));
studentList.add(new Student("Ryan", 18, Student.GENDER_MALE, "ClassB"));
List<Student> list = new ArrayList<>();
for (Student stu : studentList) {
if (stu.getGender() == Student.GENDER_FEMALE) {
list.add(stu);
}
}
//打印结果(后面会学到,这个就是用stream实现的)
list.stream().map(Student::getName).forEach(System.out::println);
}
如果换成Stream的写法将会非常简单,看看以下代码:
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("Jason", 18, Student.GENDER_MALE, "ClassA"));
studentList.add(new Student("May", 17, Student.GENDER_FEMALE, "ClassB"));
studentList.add(new Student("Angelia", 18, Student.GENDER_FEMALE, "ClassB"));
studentList.add(new Student("Alisa", 16, Student.GENDER_FEMALE, "ClassA"));
studentList.add(new Student("Aimee", 16, Student.GENDER_FEMALE, "ClassA"));
studentList.add(new Student("Ryan", 18, Student.GENDER_MALE, "ClassB"));
List<Student> list = studentList.stream() //获得一个stream流对象
//筛选出女性同学(通过lambda表达式定义)
.filter((student)->student.getGender() == Student.GENDER_FEMALE)
//筛选后获得一个列表
.collect(Collectors.toList());
//打印结果(后面会学到,这个就是用stream实现的)
list.stream().map(Student::getName).forEach(System.out::println);
}
是不是简单很多呢?段段几行代码就完成这个操作了,接下来我们好好学习一下Stream流是如何去使用的。
一、了解Stream
Stream最简单的操作,可以拆解成三步
- 源:stream会获得一个数据源,这个数据源可以是文件、List、数组等等。
- 数据处理:流的数据处理操作非常多种多样,非常类似与数据库操作。如上面我们见到的filter和map都是输入数据操作的一部分,除此之外还包括find、match、sort、reduce等,而且流的操作可以并行执行和顺序执行充分利用CPU的多核特性。后面我们会一一讲解如何使用。
- 元素序列: