現在有個需求,需要將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);
}
}
}
}
}
最近項目在拆分微服務,所以此類操作更加多了,也就有了更多的可以練手的機會,開心。