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

IT撸码课程网

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

撸码网-Java8处理List的双层循环

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

撸码网-Java8处理List的双层循环


List的双层循环我们经常遇到,一般都是当两个List某个值满足某条件时候,怎么做,做什么?

比如:

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 Family {

    @ApiModelProperty(value="家庭ID")
    private int familyId;

    @ApiModelProperty(value="丈夫名称")
    private String husbandName;

    @ApiModelProperty(value="妻子名称")
    private String wifeName;

}
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "丈夫")
public class Husband {

    @ApiModelProperty(value="家庭ID")
    private int familyId;

    @ApiModelProperty(value="丈夫名称")
    private String husbandName;

    @ApiModelProperty(value="妻子名称")
    private String wifeName;

}
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "妻子")
public class Wife {

    @ApiModelProperty(value="家庭ID")
    private int familyId;

    @ApiModelProperty(value="丈夫名称")
    private String husbandName;

    @ApiModelProperty(value="妻子名称")
    private String wifeName;

}


我们以前是怎么做的,直接用2个循环, 请看代码:


public void test7(List<Wife> wifes, List<Husband> husbands){
	List<Family> families = Lists.newArrayList();
	for(int i=0;i<wifes.size();i++){
		//System.out.println("i:"+i);
		Wife wife = wifes.get(i);
		for(int j=0;j<husbands.size();j++){
			//System.out.println("j:"+j);
			Husband husband = husbands.get(j);
			if(wife.getFamilyId() == husband.getFamilyId()){
				System.out.println("匹配成功:"+i+":"+j);
				Family family = new Family();
				family.setFamilyId(husband.getFamilyId());
				family.setHusbandName(husband.getHusbandName());
				family.setWifeName(wife.getWifeName());
				families.add(family);
			}
		}
	}
	System.out.println("Java7完美结合家庭数量:"+families.size());
	System.out.println(families);
}


//已8000*8000的两个集合进行配对。那就要循环8000*8000次。


结果如下:

Java7完美结合家庭数量:8000
[Family(familyId=0, husbandName=我是0, wifeName=0000), Family(familyId=1, husbandName=我是1, wifeName=0001), ........
Java7完美结合家庭需要时间:739


现在我们用Java8来玩玩,看看流stream是怎么做的,请看代码:


public void test8(List<Wife> wife, List<Husband> husband){
	List<Family> families = Lists.newArrayList();
	// 将list转为Map,这里key一定要为唯一值
	Map<Integer, Wife> wifeMap = wife.stream().collect(Collectors.toMap(w -> w.getFamilyId(), w -> w));
	// 匹配家庭
	families = husband.stream().map(h -> {
		Family family = new Family();
		Wife wife1 = wifeMap.get(h.getFamilyId());
		family.setFamilyId(wife1.getFamilyId());
		family.setHusbandName(h.getHusbandName());
		family.setWifeName(wife1.getWifeName());
		return family;
	}).collect(Collectors.toList());
	System.out.println("Java8完美结合家庭数量:"+families.size());
	/*families.stream().forEach(family -> {
		System.out.println("家庭ID:" + family.getFamilyId() + ",丈夫:" + family.getHusbandName() + ",妻子:" + family.getWifeName());
	});*/
}


结果如下:

[Family(familyId=0, husbandName=我是0, wifeName=0000), Family(familyId=1, husbandName=我是1, wifeName=0001), ...........
Java8完美结合家庭数量:8000
Java8完美结合家庭需要时间:65


最后结果是Java7用了  739,  Java8只要  65

这种效率天差地别,特别是数据量大的时候。


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

精彩评论0

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

本版积分规则