从零开始SpringCloud Alibaba实战(81)——java8的List集合双层for循环效率优化

  • Post author:
  • Post category:java


首先先来一个案例简单模拟一下:

List<String> wifes = new ArrayList<String>();
List<String> husbands= new ArrayList<String>();
for(int i=0;i<8000;i++){
      wifes.add(new Wife(i, i+"的妻子", "000"+i));
}
for(int i=0;i<8000;i++){
      husbands.add(new Husband(i, "我是"+i, "000"+i));
}
 
//现在需要让妻子和丈夫进行配对组成一个家庭,按照familyId进行配对
在1.8之前你会这么写:
for(int i=0;i<wifes.size();i++){
        System.out.println("i:"+i);
    for(int j=0;j<husbands.size();j++){
        System.out.println("j:"+j);
          if(妻子的familyid==丈夫的familyid){
                System.out.println("匹配成功:"+i+":"+j);
          }
    }
}
已8000*8000的两个集合进行配对。那就要循环8000*8000次。按20s循环一轮。需要20*8000秒

如果按照jdk1.8的lamada表达式进行匹配的话。这个测试结果是ms级别的

// 将list转为Map,这里key一定要为唯一值,map(familyId,wife对象)

Map<String, Wife> wifeMap = wife.stream().collect(

Collectors.toMap(w -> w.getFamilyId(),

w -> w));

// 匹配家庭

families = husband.stream().map(h -> {


//从wifeMap里面根据husband的familyId去匹配。匹配上后组装成家庭对象然后放入集合。最后生成新的家庭集合

return toFamily(wifeMap.get(h.getFamilyId()), h);

}).collect(Collectors.toList());


public class TestFamily {
    @Test
    public void familyTest() {
        List<Wife> wife = Lists.newArrayList();
        List<Husband> husband = Lists.newArrayList();
        for(int i=0;i<8000;i++){
            wife.add(new Wife(i, i+"的妻子", "000"+i));
        }
 
        for(int i=0;i<8000;i++){
            husband.add(new Husband(i, "我是"+i, "000"+i));
        }
        Long startTime =System.currentTimeMillis();
        System.out.println("当前时间:"+startTime);
        List<Family> families = Lists.newArrayList();
        // 将list转为Map,这里key一定要为唯一值
        Map<String, Wife> wifeMap = wife.stream().collect(
                Collectors.toMap(w -> w.getFamilyId(),
                        w -> w));
        // 匹配家庭
        families = husband.stream().map(h -> {
            return toFamily(wifeMap.get(h.getFamilyId()), h);
        }).collect(Collectors.toList());
        /*for(int i=0;i<wife.size();i++){
            System.out.println("i:"+i);
            for(int j=0;j<husband.size();j++){
                System.out.println("j:"+j);
                if(wife.get(i).getFamilyId().equals(husband.get(j).getFamilyId())){
                    System.out.println("匹配成功:"+i+":"+j);
                }
            }
        }*/
        System.out.println("循环完成");
        families.stream().forEach(family -> {
            System.out.println("家庭ID:" + family.getFamilyId() + ",丈夫:" + family.getHusbandName() + ",妻子:" + family.getWifeName());
        });
        Long endTime =System.currentTimeMillis();
        System.out.println("结束时间:"+endTime);
        System.out.println("------------耗时:---------"+(endTime-startTime)+"ms");
    }
 
    private Family toFamily(Wife wife, Husband husband) {
        Family family = new Family();
        family.setFamilyId(wife.getFamilyId());
        family.setHusbandName(husband.getHusbandName());
        family.setWifeName(wife.getWifeName());
        return family;
    }
 
    @Test
    public void test1(){
        //String.valueOf()
        BigDecimal c = new BigDecimal(651000);
        BigDecimal d = new BigDecimal(312);
        BigDecimal num3 = c.divide(d,10,BigDecimal.ROUND_HALF_DOWN);
        System.out.println(num3);
        BigDecimal b = (new BigDecimal(651000).divide(new BigDecimal(312)).setScale(1, BigDecimal.ROUND_HALF_UP));
        System.out.println(b);
 
    }
}
 

java list操作不仅对集合操作进行了优化还简化了代码

更多关于集合操作的应用请参考




java8应用汇总



应用

    public static void main(String[] args)throws Exception {
        List<IG> igs1 = Arrays.asList(new IG(11),
                                      new IG(12));

        List<IG> igs2 = Arrays.asList(new IG(11),
                                      new IG(13));
        List<IG> igs3 = Arrays.asList(new IG(11),
                                      new IG(13),
                                      new IG(13));

        //找出skuId相同的对象组成集合
        List<IG> gs1 =  igs2.stream().filter(a1 -> igs1.stream().anyMatch(a2 ->a1.getSkuId() == a2.getSkuId())
        ).collect(Collectors.toList());
        //打印输出 tSnipingGoodSkus1{11}
        gs1.stream().map(IG::getSkuId).forEach(System.out::println);

        //对skuId相同的对象属性进行操作
        List<IG> gs2 = igs2.parallelStream().map(a1 ->{//parallelStream :多线程异步stream
            IG tSnipingGoodSku =  igs1.stream().filter(a2 -> a1.getSkuId() == a2.getSkuId()).findFirst().orElse(null); //orElse 值为空返回null防止空指针异常
            if (null != tSnipingGoodSku){
                a1.setSkuId(666);
            }
            return a1;
        }).collect(Collectors.toList());
        //打印输出 tSnipingGoodSkus2{666,13}
        gs2.stream().map(IG::getSkuId).forEach(System.out::println);

        //sorted()方法: 有参从低到高排序(升序),无参从高到底排序(降序)
        List<IG> sortedEmp = igs3.stream().sorted(Comparator.comparing(IG::getSkuId)).collect(Collectors.toList());
        //输出11 13 13
        sortedEmp.stream().map(IG::getSkuId).forEach(System.out::println);
    }


    public static class IG {

        private Integer skuId;

        public Integer getSkuId() {
            return skuId;
        }

        public void setSkuId(Integer skuId) {
            this.skuId = skuId;
        }

        public IG(Integer skuId) {
            this.skuId = skuId;
        }
    }



版权声明:本文为liuerchong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。