【性能优化】两种方案优化双层for循环语句 附代码和实例 |
您所在的位置:网站首页 › 嵌套for循环优化 › 【性能优化】两种方案优化双层for循环语句 附代码和实例 |
现有如下需求,需在订单信息类中根据用户信息类的userId匹配到对应的信息并输出商品skuId。 先给出实体类:用户信息类UserInfo和订单信息类OrderInfo。用户信息类如下所示: /** * @author Carson Chu * @date 2020/1/13 19:43 * 用户信息类 */ @Data public class UserInfo { /* 用户Id */ private String userId; /* 用户名 */ private String name; /* 用户性别 */ private String gender; public UserInfo(String userId, String name, String gender) { this.userId = userId; this.name = name; this.gender = gender; } }订单信息类如下: /** * @author Carson Chu * @date 2020/1/13 19:44 * 订单信息类 */ @Data public class OrderInfo { /* 用户Id */ private String userId; /* 订单号 */ private Long orderId; /* 商品sku */ private Long skuId; /* 商品价格 */ private BigDecimal price; public OrderInfo(String userId, Long orderId, Long skuId, BigDecimal price) { this.userId = userId; this.orderId = orderId; this.skuId = skuId; this.price = price; } }假设用户信息表和订单信息表中各有十万条数据,需要匹配到商品skuId,先采用双层for循环,附上main()方法逻辑: /** * @author Carson Chu * @date 2020/1/13 20:09 */ public class Main { public static void main(String[] args) { /* 用户信息集合 */ List userInfoList = Lists.newArrayList(); /* 订单信息集合 */ List orderInfoList = Lists.newArrayList(); /* 手动向集合中添加十万条数据 */ for (int i = 0; i for (OrderInfo orderInfo : orderInfoList) { if (userInfo.getUserId().equals(orderInfo.getUserId())) { System.out.println(orderInfo.getSkuId()); } } } long end = System.currentTimeMillis(); System.out.println("采用原始的双层for循环查询累计耗时:" + (end - start) + "毫秒"); } /** * 生成指定长度的随机数 * * @param length * @return */ public static String createNum(int length) { StringBuilder sb = new StringBuilder(); Random rand = new Random(); for (int i = 0; i hashMap.put(orderInfo.getUserId(), orderInfo.getSkuId()); } for (UserInfo userInfo : userInfoList) { System.out.println(hashMap.get(userInfo.getUserId())); } long end = System.currentTimeMillis(); System.out.println("利用HashMap查询累计耗时:" + (end - start) + "毫秒");
此外也可以采用jdk8的lambda表达式: long start = System.currentTimeMillis(); // 将List转为Map,这里key一定要为唯一值 Map userInfoMap = userInfoList.stream().collect(Collectors.toMap(userInfo -> userInfo.getUserId(), userInfo -> userInfo)); // 商品skuId集合 List skuIdList = Lists.newArrayList(); skuIdList = orderInfoList.stream().map(orderInfo -> { return getSkuId(userInfoMap.get(orderInfo.getUserId()), orderInfo); }).collect(Collectors.toList()); skuIdList.stream().forEach(skuId -> { System.out.println("商品skuId:" + skuId); }); long end = System.currentTimeMillis(); System.out.println("利用lambda表达式和stream流查询累计耗时:" + (end - start) + "毫秒");附加匹配用户信息和订单信息的方法逻辑: /** * 匹配用户信息和订单信息,成功匹配后返回用户对应的商品skuId * * @param userInfo * @param orderInfo * @return */ private static Long getSkuId(UserInfo userInfo, OrderInfo orderInfo) { if (orderInfo.getUserId().equals(userInfo.getUserId())) { return orderInfo.getSkuId(); } return null; }
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |