java8的新特性之List集合双层for循环效率优化

FAILED
白色玫瑰 程序猿

时间: 2023-07-11 阅读: 1 字数:4972

sjxi.cn
首先先来一个案例简单模拟一下: List<String> wifes = new ArrayList<String>(); List<String> husbands= new ArrayList<String&...,...

目录

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

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

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

    1. // 将list转为Map,这里key一定要为唯一值,map(familyId,wife对象)
    2. Map<String, Wife> wifeMap = wife.stream().collect(
    3. Collectors.toMap(w -> w.getFamilyId(),
    4. w -> w));
    5. // 匹配家庭
    6. families = husband.stream().map(h -> {
    7. //从wifeMap里面根据husband的familyId去匹配。匹配上后组装成家庭对象然后放入集合。最后生成新的家庭集合
    8. return toFamily(wifeMap.get(h.getFamilyId()), h);
    9. }).collect(Collectors.toList());

    这是个测试案例:亲测如下:

    1. package com.nuanshui.frms.report.manage;
    2. import com.google.common.collect.Lists;
    3. import org.junit.Test;
    4. import java.math.BigDecimal;
    5. import java.util.List;
    6. import java.util.Map;
    7. import java.util.stream.Collectors;
    8. /**
    9. * Author:
    10. * Date: 2016/11/23.
    11. * Time: 18:17
    12. */
    13. public class TestFamily {
    14. @Test
    15. public void familyTest() {
    16. List<Wife> wife = Lists.newArrayList();
    17. List<Husband> husband = Lists.newArrayList();
    18. for(int i=0;i<8000;i++){
    19. wife.add(new Wife(i, i+"的妻子", "000"+i));
    20. }
    21. for(int i=0;i<8000;i++){
    22. husband.add(new Husband(i, "我是"+i, "000"+i));
    23. }
    24. Long startTime =System.currentTimeMillis();
    25. System.out.println("当前时间:"+startTime);
    26. List<Family> families = Lists.newArrayList();
    27. // 将list转为Map,这里key一定要为唯一值
    28. Map<String, Wife> wifeMap = wife.stream().collect(
    29. Collectors.toMap(w -> w.getFamilyId(),
    30. w -> w));
    31. // 匹配家庭
    32. families = husband.stream().map(h -> {
    33. return toFamily(wifeMap.get(h.getFamilyId()), h);
    34. }).collect(Collectors.toList());
    35. /*for(int i=0;i<wife.size();i++){
    36. System.out.println("i:"+i);
    37. for(int j=0;j<husband.size();j++){
    38. System.out.println("j:"+j);
    39. if(wife.get(i).getFamilyId().equals(husband.get(j).getFamilyId())){
    40. System.out.println("匹配成功:"+i+":"+j);
    41. }
    42. }
    43. }*/
    44. System.out.println("循环完成");
    45. families.stream().forEach(family -> {
    46. System.out.println("家庭ID:" + family.getFamilyId() + ",丈夫:" + family.getHusbandName() + ",妻子:" + family.getWifeName());
    47. });
    48. Long endTime =System.currentTimeMillis();
    49. System.out.println("结束时间:"+endTime);
    50. System.out.println("------------耗时:---------"+(endTime-startTime)+"ms");
    51. }
    52. private Family toFamily(Wife wife, Husband husband) {
    53. Family family = new Family();
    54. family.setFamilyId(wife.getFamilyId());
    55. family.setHusbandName(husband.getHusbandName());
    56. family.setWifeName(wife.getWifeName());
    57. return family;
    58. }
    59. @Test
    60. public void test1(){
    61. //String.valueOf()
    62. BigDecimal c = new BigDecimal(651000);
    63. BigDecimal d = new BigDecimal(312);
    64. BigDecimal num3 = c.divide(d,10,BigDecimal.ROUND_HALF_DOWN);
    65. System.out.println(num3);
    66. BigDecimal b = (new BigDecimal(651000).divide(new BigDecimal(312)).setScale(1, BigDecimal.ROUND_HALF_UP));
    67. System.out.println(b);
    68. }
    69. }

    结果只要252ms;

    这种效率天差地别。

    原文地址:https://blog.csdn.net/liyingying111111/article/details/82464380?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168904454516800225524999%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168904454516800225524999&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-24-82464380-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96

    本文章网址:sjxi.cn/detil/09bc2efc30854e88b379cdd9da4cef88

    打赏作者

    本站为非盈利网站,如果您喜欢这篇文章,欢迎支持我们继续运营!

    最新评论
    当前未登陆哦
    登陆后才可评论哦

      湘ICP备2021009447号

      ×

      (穷逼博主)在线接单

      QQ: 1164453243

      邮箱: abcdsjx@126.com

      前端项目代做
      前后端分离
      Python 爬虫脚本
      Java 后台开发
      各种脚本编写
      服务器搭建
      个人博客搭建
      Web 应用开发
      Chrome 插件编写
      Bug 修复