登录 后使用快捷导航
没有帐号?立即注册

IT撸码课程网

用户名   找回密码
  立即注册
发新帖

撸码网-Java8怎么用?怎样用好Java8的新功能?Java8分组合并对象属性

[复制链接]
100 212 100
发表于2019-01-21 16:29:43 | 只看楼主 | 阅读模式
下一主题
登录后查看本帖详细内容!您需要登录后才可以下载 登录 | 立即注册


撸码网-Java8怎么用?怎样用好Java8的新功能?Java8分组合并对象属性


最近在做项目遇到一个需求,先是用Java7的常规方法做,代码评审之后,架构师说用Java8新的方法做,

需求, 调用多个微服务返回多个结果, 最后想把多个结果合并成一个对象批量插入数据库, 而不要微服务调用第一个对象插入数据库,后面的根据ID去更新数据库;

微服务返回多个结果是List<Student>   List<Chinese>  List<Maths>   List<English>      合并到 List<StudentScore> 对象中;

直接上代码:


几个实体如下:

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "学生实体表")
public class Student {

    @ApiModelProperty(value="学生ID")
    private int id;

    @ApiModelProperty(value="学生名称")
    private String name;

    @ApiModelProperty(value="学生分数")
    private int score;

}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "学生语文成绩实体表")
public class Chinese {

    @ApiModelProperty(value="学生ID")
    private int id;

    @ApiModelProperty(value="语文分数")
    private int scoreChinese;

}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "学生数学成绩实体表")
public class Maths {

    @ApiModelProperty(value="学生ID")
    private int id;

    @ApiModelProperty(value="数学分数")
    private int scoreMath;

}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "学生英语成绩实体表")
public class English {

    @ApiModelProperty(value="学生ID")
    private int id;

    @ApiModelProperty(value="英语分数")
    private int scoreEnglish;

}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "学生分数实体表")
public class StudentScore {

    @ApiModelProperty(value="学生ID")
    private int id;

    @ApiModelProperty(value="学生名称")
    private String name;

    @ApiModelProperty(value="学生分数")
    private int score;

    @ApiModelProperty(value="语文分数")
    private int scoreChinese;

    @ApiModelProperty(value="数学分数")
    private int scoreMath;

    @ApiModelProperty(value="英语分数")
    private int scoreEnglish;

}



需求是根据 学生ID 最终合并成 StudentScore这个对象。

Java7的方法是这样的:

public void test77(List<Student> students, List<Chinese> chinese, List<Maths> maths, List<English> english){
	List<StudentScore> list = new ArrayList<>();
	for (int i = 0; i < students.size(); i++) {
		StudentScore stuSco = new StudentScore();
		Student student = students.get(i);
		stuSco.setId(student.getId());
		stuSco.setName(student.getName());
		stuSco.setScore(student.getScore());
		for (int j = 0; j < chinese.size(); j++) {
			Chinese chinese1 = chinese.get(j);
			if (student.getId() == chinese1.getId()) {
				stuSco.setScoreChinese(chinese1.getScoreChinese());
			}
		}
		list.add(stuSco);
	}
	List<StudentScore> list1 = new ArrayList<>();
	for (int i = 0; i < list.size(); i++) {
		StudentScore stuSco1 = new StudentScore();
		StudentScore studentScore = list.get(i);
		stuSco1.setId(studentScore.getId());
		stuSco1.setName(studentScore.getName());
		stuSco1.setScore(studentScore.getScore());
		stuSco1.setScoreChinese(studentScore.getScoreChinese());
		for (int j = 0; j < maths.size(); j++) {
			Maths maths1 = maths.get(j);
			if (studentScore.getId() == maths1.getId()) {
				stuSco1.setScoreMath(maths1.getScoreMath());
			}
		}
		list1.add(stuSco1);
	}
	List<StudentScore> list2 = new ArrayList<>();
	for (int i = 0; i < list1.size(); i++) {
		StudentScore stuSco2 = new StudentScore();
		StudentScore studentScore = list1.get(i);
		stuSco2.setId(studentScore.getId());
		stuSco2.setName(studentScore.getName());
		stuSco2.setScore(studentScore.getScore());
		stuSco2.setScoreChinese(studentScore.getScoreChinese());
		stuSco2.setScoreMath(studentScore.getScoreMath());
		for (int j = 0; j < english.size(); j++) {
			English english1 = english.get(j);
			if (studentScore.getId() == english1.getId()) {
				stuSco2.setScoreEnglish(english1.getScoreEnglish());
			}
		}
		list2.add(stuSco2);
	}
	System.out.println(list2.size());
	System.out.println(list2);
}

代码评审之后改成Java8, Java8是这样的:


public void test88(List<Student> students, List<Chinese> chinese, List<Maths> maths, List<English> english){

	//语文成绩流处理,根据学生ID分组
	Map<Integer, Chinese> g1 = chinese.stream().collect(Collectors.toMap(Chinese::getId, a -> a,(k1,k2)->k1));
	Map<Integer, Maths> g2 = maths.stream().collect(Collectors.toMap(Maths::getId, a -> a,(k1,k2)->k1));
	Map<Integer, English> g3 = english.stream().collect(Collectors.toMap(English::getId, a -> a,(k1,k2)->k1));

	List<StudentScore> list = new ArrayList<>();
	students.forEach(student -> {
		StudentScore stuSco = new StudentScore();
		int id = student.getId();
		stuSco.setId(id);
		stuSco.setName(student.getName());
		stuSco.setScore(student.getScore());
		Chinese chinese1 = g1.get(id);
		Maths maths1 = g2.get(id);
		English english1 = g3.get(id);
		if (chinese1 != null) {
			stuSco.setScoreChinese(chinese1.getScoreChinese());
		}
		if (maths1 != null) {
			stuSco.setScoreMath(maths1.getScoreMath());
		}
		if (english1 != null) {
			stuSco.setScoreEnglish(english1.getScoreEnglish());
		}
		list.add(stuSco);
	});
	System.out.println(list.size());
	System.out.println(list);
}


看看是不是很简洁了。效率是不是提高了,以前那么多循环现在转成Map,最后只有一个循环了,

Jdk8 lambda foreach棒棒的!

Jdk8 stream棒棒的!


IT撸码网 - 必读申明1、本站会员可发帖,本主题所有言论和图片纯属会员个人意见,与本论坛立场无关.
2、本站所有帖子由该帖子作者发表,该帖子作者享有帖子相关权益.
3、本帖内容来网友及会员分享和其它网络媒体.
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意!
5、若因内容问题IT撸码网管理员和版主有权不事先通知发贴者而删除本文.
6、本站课程仅供本站会员学习参考,不得传播及用于其他用途,学习完后请在24小时内自行删除.
7、本站资源质量虽均经精心审查,但也难保万无一失,若发现资源有问题影响学习请一定及时点此进行问题反馈,我们会积极为您解决问题!
8、若发现链接失效了点此进行链接失效反馈,我们会第一时间修复链接.

精彩评论0

您需要登录后才可以发帖查看详细内容! 登录 | 立即注册
*
 

本版积分规则