Java8的stream api用法(包括flatMap)
Java8的stream api用法
测试实体类:班级
import java.util.List;
public class BanJi {
private String banJiName;
private List<Student> studentList;
public String getBanJiName() {
return banJiName;
}
public void setBanJiName(String banJiName) {
this.banJiName = banJiName;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
测试实体类:学生
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
stream测试类
import java.util.*;
import java.util.stream.Collectors;
public class StreamTest {
public static void main(String[] args) {
//不使用stream
noStream();
//使用stream
stream();
//使用flatMapStream
flatMapStream();
}
public static void noStream() {
List<Student> students = Arrays.asList(
new Student("张初一", 13),
new Student("李初二", 14),
new Student("孙初三", 15),
new Student("王初一", 12),
new Student("钱初二", 14),
new Student("周初三", 16));
List<Student> resultStudent = new ArrayList<>();
for (Student student : students) {
if (student.getAge() < 14) {
resultStudent.add(student);
}
}
//排序
Collections.sort(resultStudent, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return Integer.compare(o1.getAge(), o2.getAge());
}
});
List<String> resultName = new ArrayList<>();
for (Student student : resultStudent) {
resultName.add(student.getName());
}
System.out.println(resultName);
}
/**
* 一班stream用法
*/
public static void stream() {
List<Student> students = Arrays.asList(
new Student("张初一", 13),
new Student("李初二", 14),
new Student("孙初三", 15),
new Student("王初一", 12),
new Student("钱初二", 14),
new Student("周初三", 16));
List<String> collect = students.stream()
.filter(student -> student.getAge() < 14) //筛选年龄
.sorted(Comparator.comparing(Student::getAge)) //按照年龄排序
.map(Student::getName) //提取姓名
.collect(Collectors.toList()); //将提取的数据保存到List中
System.out.println(collect);
}
/**
* flatMap用法
* 嵌套list的处理
* 找出所有班级年龄大于13岁的学生名字
*/
public static void flatMapStream(){
List<Student> banJiOnestudents = Arrays.asList(
new Student("张初一", 13),
new Student("李初二", 14),
new Student("孙初三", 15),
new Student("王初一", 12),
new Student("钱初二", 14),
new Student("周初三", 16));
BanJi banJiOne = new BanJi();
banJiOne.setBanJiName("一班");
banJiOne.setStudentList(banJiOnestudents);
List<Student> banJiTwostudents = Arrays.asList(
new Student("2张初一", 13),
new Student("2李初二", 14),
new Student("2孙初三", 15),
new Student("2王初一", 12),
new Student("2钱初二", 14),
new Student("2周初三", 16));
BanJi banJiTwo = new BanJi();
banJiTwo.setBanJiName("二班");
banJiTwo.setStudentList(banJiTwostudents);
List<BanJi> banJiList = new ArrayList<>();
banJiList.add(banJiOne);
banJiList.add(banJiTwo);
List<String> collect = banJiList.stream()
.flatMap(banJi -> banJi.getStudentList().stream())
.filter(student -> student.getAge() > 13)
.map(student -> student.getName())
.collect(Collectors.toList());
System.out.println("所有班级中,年龄超过13岁的同学有:");
System.out.println(collect);
}
}