美文网首页
Java 7和Java 8对list的双层循环处理

Java 7和Java 8对list的双层循环处理

作者: Djbfifjd | 来源:发表于2020-07-31 21:12 被阅读0次

    一、准备

    Java 处理 List 的双层循环,一般都是当两个 List 某个值满足某条件时候,进行相应的处理。需求:两个 List 对象当 id 相同的时候就组建成美好的家庭,Husband 对象与 Wife 对象组建成 Family 对象。

    Husband 对象如下:

    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 Husband {
        @ApiModelProperty(value = "家庭ID")
        private int familyId;
        @ApiModelProperty(value = "丈夫名称")
        private String husbandName;
        @ApiModelProperty(value = "妻子名称")
        private String wifeName;
    }
    

    Wife 对象如下:

    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 Wife {
        @ApiModelProperty(value = "家庭ID")
        private int familyId;
        @ApiModelProperty(value = "丈夫名称")
        private String husbandName;
        @ApiModelProperty(value = "妻子名称")
        private String wifeName;
    }
    

    Family 对象如下:

    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;
    }
    

    二、对比

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    public class FamilyDemo {
        public static void main(String[] args) {
            List<Wife> wives = new ArrayList<>();
            List<Husband> husbands = new ArrayList<>();
            for (int i = 0; i < 10000; i++) {
                wives.add(new Wife(i, i + "的妻子", "000" + i));
            }
            for (int i = 0; i < 10000; i++) {
                husbands.add(new Husband(i, "我是" + i, "000" + i));
            }
            FamilyDemo familyDemo = new FamilyDemo();
            familyDemo.testJava7(wives, husbands);
            familyDemo.testJava8(wives, husbands);
        }
    
        public void testJava7(List<Wife> wives, List<Husband> husbands) {
            List<Family> families = new ArrayList<>();
            for (int i = 0; i < wives.size(); i++) {
                Wife wife = wives.get(i);
                for (int j = 0; j < husbands.size(); j++) {
                    Husband husband = husbands.get(j);
                    if (wife.getFamilyId() == husband.getFamilyId()) {
                        Family family = new Family();
                        family.setFamilyId(husband.getFamilyId());
                        family.setHusbandName(husband.getHusbandName());
                        family.setWifeName(husband.getWifeName());
                        families.add(family);
                    }
                }
            }
            System.out.println("Java7结合家庭数量:" + families.size());
            System.out.println(families);
        }
    
        public void testJava8(List<Wife> wives, List<Husband> husbands) {
            List<Family> families = new ArrayList<>();
            //将list转为Map,这里key必须是唯一的,即familyId
            Map<Integer, Wife> wifeMap = wives.stream().collect(Collectors.toMap(w -> w.getFamilyId(), w -> w));
            families = husbands.stream().map(h -> {
                Family family = new Family();
                Wife wife = wifeMap.get(h.getFamilyId());
                family.setFamilyId(wife.getFamilyId());
                family.setHusbandName(wife.getHusbandName());
                family.setWifeName(wife.getWifeName());
                return family;
            }).collect(Collectors.toList());
            System.out.println("Java8完美结合家庭数量:" + families.size());
            families.stream().forEach(family -> {
                System.out.println("家庭ID:" + family.getFamilyId());
            });
        }
    }
    

    对比下来,stream 效率明显提升了很多,尤其数据量大的时候效率提升得越高。

    相关文章

      网友评论

          本文标题:Java 7和Java 8对list的双层循环处理

          本文链接:https://www.haomeiwen.com/subject/xxmrrktx.html