java8新特性Stream进阶-对对象进行操作

文章介绍了Java8Stream的进阶用法,包括根据对象属性进行提取、过滤、分组、排序以及查询特定对象的操作。通过示例展示了如何使用Stream处理对象列表,如提取学生的姓名、过滤年龄大于等于20的学生、按性别分组、按成绩排序以及查找特定ID的学生。
摘要由CSDN通过智能技术生成

整体描述

之前写过一篇对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);

运行结果:
运行结果1

如图,将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());
        }

运行结果:
运行结果2
如图,过滤出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());
        }

运行结果:
运行结果3
如图,分组结果为两组,性别为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());
        }

运行结果:
运行结果4

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的用法很多,也很强大,熟练掌握对代码的优化和性能有很大提升,本篇就先写这么多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值