List<vo>转为Map<id,vo>--lamda表达式

本文介绍了如何通过将一个列表转换为Map来优化多层循环的效率。在示例中,通过Java Stream API将Student列表转换为Map,以学号为键,避免了对Grade列表的双层循环,简化为单层循环,提高了查找匹配项的速度。这种方法在处理大量数据时能显著提升性能。
摘要由CSDN通过智能技术生成

背景:需要获取两个或者多个list<对象>中的属性值,一般做法可以用嵌套循环。
避免多层for循环,可以先将一个list转为Map<id,vo>,然后遍历另一个list
 Map<Integer, Student> studentMap = getStudentList().stream().collect(Collectors.toMap(Student::getSid,a->a,(k1,k2)->k2));

public class Demo {
    public static void main(String[] args) {
        //方法1:双层循环
        for (Grade grade : getGradeList()) {
            for (Student student : getStudentList()){
                if (grade.getSid().equals(student.getSid())){
                    System.out.println("学号:"+grade.getSid()+",姓名:"+student.getName()+",成绩:"+grade.getScore());
                }
            }
        }        
        //方法2:单层循环
        //sid->Student    学号->学生对象
        Map<Integer, Student> studentMap = getStudentList().stream().collect(Collectors.toMap(Student::getSid,a->a,(k1,k2)->k2));
        for (Grade grade : getGradeList()) {
            System.out.println("学号:"+grade.getSid()+",姓名:"+studentMap.get(grade.getSid()).getName()+",成绩:"+grade.getScore());
        }
    }
    private static List<Student> getStudentList(){
        List<Student> list = new ArrayList<>();
        Student student = new Student();
        student.setSid(11);
        student.setName("小李");
        list.add(student);
        Student student2 = new Student();
        student2.setSid(12);
        student2.setName("小王");
        list.add(student2);
        return list;
    }
    private static List<Grade> getGradeList(){
        List<Grade> list = new ArrayList<>();
        Grade grade = new Grade();
        grade.setId(1);
        grade.setSid(11);
        grade.setScore(80);
        list.add(grade);
        Grade grade2 = new Grade();
        grade2.setId(2);
        grade2.setSid(12);
        grade2.setScore(90);
        list.add(grade2);
        return list;
    }
}
@Data
class Student{
    private Integer sid;
    private String name;
}
@Data
class Grade{
    private Integer id;
    private Integer sid;
    private Integer score;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值