现在有个需求,需要将student表和class表的所有数据返回回去,关联条件时class_id。如果用sql很容易实现,直接连表查询就可以了,但是现在项目是微服务,不能连表查询了,所以得在代码里面修改。
定义三个类,student类,class类,还有返回所有数据的studentAndClass类。
import java.util.ArrayList;
import java.util.List;
/**
* Created by 郝雨烁 on 2019/12/1.
*/
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getClassId() {
return classId;
}
public void setClassId(Integer classId) {
this.classId = classId;
}
private Integer classId;
public Student(Integer id, String name, Integer classId) {
this.id = id;
this.name = name;
this.classId = classId;
}
@Override
public String toString() {
return super.toString();
}
}
/**
* Created by 郝雨烁 on 2019/12/2.
*/
public class Class {
private Integer classId;
private String className;
public Integer getClassId() {
return classId;
}
public void setClassId(Integer classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Class(Integer classId, String className) {
this.classId = classId;
this.className = className;
}
@Override
public String toString() {
return super.toString();
}
}
数据组装代码如下
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Student student = new Student(1,"小明",1);
Student student1= new Student(2,"小红",2);
studentList.add(student);
studentList.add(student1);
List<Class> classList = new ArrayList<>();
Class cl = new Class(1,"1班");
Class c2 = new Class(2,"2班");
classList.add(cl);
classList.add(c2);
List<StudentAndClass> list = new ArrayList<>();
for (Student studentArray : studentList) {
for (Class aClass : classList) {
if(studentArray.getClassId().equals(aClass.getClassId())){
StudentAndClass studentAndClass = new StudentAndClass();
studentAndClass.setClassId(studentArray.getClassId());
studentAndClass.setClassName(aClass.getClassName());
studentAndClass.setId(studentArray.getId());
studentAndClass.setName(studentArray.getName());
list.add(studentAndClass);
}
}
}
}
}
双层for循环,此时时间复杂度是n2.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Student student = new Student(1,"小明",1);
Student student1= new Student(2,"小红",2);
studentList.add(student);
studentList.add(student1);
List<Class> classList = new ArrayList<>();
Class cl = new Class(1,"1班");
Class c2 = new Class(2,"2班");
classList.add(cl);
classList.add(c2);
// list 转成map,map存放的是key和value的映射关系
Map<Integer,Class> map = new HashMap<>();
for (Class aClass : classList) {
map.put(aClass.getClassId(),aClass);
}
List<StudentAndClass> list = new ArrayList<>();
if(studentList.size()>0){
for (Student studentArray : studentList) {
Class c1= map.get(studentArray.getClassId());
if(c1!=null){
StudentAndClass studentAndClass = new StudentAndClass();
studentAndClass.setClassId(studentArray.getClassId());
studentAndClass.setClassName(c1.getClassName());
studentAndClass.setId(studentArray.getId());
studentAndClass.setName(studentArray.getName());
list.add(studentAndClass);
}
}
}
}
将其中一个list转成map之后就成了并列for循环。此时时间复杂度成了n。
lamda表达式解决list转map问题更加方便了,一句代码解决三句代码才解决的问题。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Student student = new Student(1,"小明",1);
Student student1= new Student(2,"小红",2);
studentList.add(student);
studentList.add(student1);
List<Class> classList = new ArrayList<>();
Class cl = new Class(1,"1班");
Class c2 = new Class(2,"2班");
classList.add(cl);
classList.add(c2);
// list 转成map,map存放的是key和value的映射关系
// Map<Integer,Class> map = new HashMap<>();
// for (Class aClass : classList) {
// map.put(aClass.getClassId(),aClass);
// }
Map<Integer, Class> map = classList.stream().collect(Collectors.toMap(Class::getClassId, e -> e));
List<StudentAndClass> list = new ArrayList<>();
if(studentList.size()>0){
for (Student studentArray : studentList) {
Class c1= map.get(studentArray.getClassId());
if(c1!=null){
StudentAndClass studentAndClass = new StudentAndClass();
studentAndClass.setClassId(studentArray.getClassId());
studentAndClass.setClassName(c1.getClassName());
studentAndClass.setId(studentArray.getId());
studentAndClass.setName(studentArray.getName());
list.add(studentAndClass);
}
}
}
}
}
最近项目在拆分微服务,所以此类操作更加多了,也就有了更多的可以练手的机会,开心。