java8新特性Stream进阶-对对象进行操作
整体描述
之前写过一篇对stream的简单介绍, java8新特性Stream简介,主要是对stream的基本用法进行介绍,本篇总结一下stream的进阶操作,对对象进行处理。
准备工作
对象创建
既然是对对象进行处理,首先在这里先定义一个对象,就简单创建一个就行:
public class Student {
private Long id;
private String name;
private Integer age;
private String sex;
private Double score;
public Student() {
}
public Student(Long id, String name, Integer age, String sex, Double score) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
public Long getId() {
return id;
}
public void setId(Long 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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
}
main方法
创建完对象之后,手动创建一个List,因为stream主要是对List进行操作的。
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Student student1 = new Student(1L, "name1", 20, "M", 85.0);
Student student2 = new Student(2L, "name2", 22, "F", 90.0);
Student student3 = new Student(3L, "name3", 19, "M", 80.0);
Student student4 = new Student(4L, "name4", 24, "M", 95.0);
Student student5 = new Student(5L, "name5", 16, "F", 70.0);
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
studentList.add(student4);
studentList.add(student5);
// 下文的示例代码在这添加
具体方法
准备工作做完之后,就可以开始了。
1. 根据对象中的一项进行提取
将对象里的一项组成一个数组,需要去重的话再collect之前加distinct()即可,此处将name提取出来组成一个List。
// 1. 将对象里的一项组成一个数组,需要去重的话再collect之前加distinct()即可
// 1. 将name提取出来组成一个List<String>
List<String> list1 = studentList.stream().map(Student::getName).collect(Collectors.toList());
System.out.println("1--->nameList:" + list1);
运行结果:
如图,将5个名字提取成一个新的List。
2. 根据对象中的一项进行过滤
根据对象中的一项进行过滤,组成一个新的List。此处将过滤Student中年龄大于等于20的,组成一个新的List。
List<Student> list2 = studentList.stream().filter(student -> student.getAge() >= 20).collect(Collectors.toList());
for (Student student : list2) {
System.out.println("2--->student:" + student.getName());
}
运行结果:
如图,过滤出3个。此处也可以和第一个用法相结合,达到过滤出学生年龄大于等于20的学生的名字,学生的id等。
3. 根据对象中的一项进行分组
可以根据对象中的一项进行分组,返回一个map,map的key就是这一项的值,原list中有几个值,就会有几个key,value是List,在这个list里这一项的值都是key的值。和sql中的groupby有点像。此处根据性别将Student的List进行分组。
Map<String, List<Student>> map3 = studentList.stream().collect(Collectors.groupingBy(Student::getSex, HashMap::new, Collectors.toList()));
for (String sex : map3.keySet()) {
System.out.println("3--->sex:" + sex + ",students num:" + map3.get(sex).size());
}
运行结果:
如图,分组结果为两组,性别为F的2人,性别为M的3人。
4. 根据对象中的一项进行排序
根据对象中的某一项,进行排序,并可以返回前几项。此处找出成绩前三的学生,注意排序的字段不能为空否则报错。
List<Student> students4 = studentList.stream().sorted(Comparator.comparing(Student::getScore).reversed()).limit(3).collect(Collectors.toList());
for (Student student : students4) {
System.out.println("4--->student:" + student.getName() + ",score:" + student.getScore());
}
运行结果:
5. 查询特定条件对象是否存在
查询对象是否存在,返回的也是一个java8新加的对象,Optional。此处查询id是3的学生,如果存在多个返回第一个。
Optional<Student> optional5 = studentList.stream().filter(student -> student.getId().equals(3L)).findFirst();
if (optional5.isPresent()) {
Student student = optional5.get();
System.out.println("5--->student:" + student.getName() + ",id:" + student.getId());
} else {
System.out.println("5--->id=4 not find");
}
运行结果:
总结
stream的用法很多,也很强大,熟练掌握对代码的优化和性能有很大提升,本篇就先写这么多。