优化下面代码 for (int i = 0; i < 10; i++) { long sum = detailList.stream().mapToLong(detail -> detail.getCells().get(i).getPeople()).sum(); }
时间: 2024-03-09 11:45:31 浏览: 60
可以将 detailList.stream() 提取到循环外部,同时使用并行流来提高计算效率。代码如下:
```
IntStream.range(0, 10)
.parallel()
.forEach(i -> {
long sum = detailList.parallelStream()
.mapToLong(detail -> detail.getCells().get(i).getPeople())
.sum();
// do something with sum
});
```
这样可以避免每次都创建一个流对象,同时并行流可以利用多线程来提高计算效率。
相关问题
使用中文解释以下代码: // 获取奖池数据 List<PasturePrize> pasturePrizes = baseMapper.selectList(); // 中奖总率 long sum = pasturePrizes.stream().mapToLong(PasturePrize::getPrizeRate).sum(); // 随机生成一个中奖数 Random random = new Random(); int luckNum = random.nextInt((int) sum); Integer tmp = 0; Integer tmp2 = 0; for (int i = 0; i < pasturePrizes.size(); i++) { if (tmp2 == 0) { tmp2 = pasturePrizes.get(0).getPrizeRate(); } if (luckNum >= tmp && luckNum <= tmp2){ PasturePrizeRecord pasturePrizeRecord = new PasturePrizeRecord(); pasturePrizeRecord.setPrizeName(pasturePrizes.get(i).getPrizeName()); pasturePrizeRecord.setPhone(user.getPhone()); pasturePrizeRecord.setPrizePrice(pasturePrizes.get(i).getPrizePrice()); if(pasturePrizes.get(i).getPrizeType().equals("积分")){ pasturePrizeRecord.setPrizeType("积分"); }else { pasturePrizeRecord.setPrizeType("现金"); } pasturePrizeRecord.setUserId(user.getId()); pasturePrizeRecord.setUsername(user.getUsername()); pasturePrizeRecordMapper.insert(pasturePrizeRecord); if (pasturePrizes.get(i).getPrizeType().equals("现金")){ user.setBalance(pasturePrizes.get(i).getPrizePrice().add(user.getBalance())); }else { user.setFeed(pasturePrizes.get(i).getPrizePrice().add(user.getFeed())); } user.setDrawLotteryRaffleTotal(user.getDrawLotteryRaffleTotal() - 1); pastureUserMapper.updateById(user); return pasturePrizes.get(i); } else { if (tmp == 0L){ tmp = tmp + pasturePrizes.get(i).getPrizeRate(); } else { if (i < pasturePrizes.size() - 1){ tmp = tmp2; } } if (i< pasturePrizes.size() - 1){ tmp2 = tmp2 + pasturePrizes.get(i + 1).getPrizeRate(); } } }
这段代码是获取奖池数据,计算中奖总率,随机生成一个中奖数,然后根据中奖数在奖池中匹配对应的奖品。具体实现是通过遍历奖池中的每个奖品,将每个奖品的中奖率相加得到中奖总率,然后随机生成一个中奖数,再通过遍历奖池中的每个奖品,累加每个奖品的中奖率,直到累加值大于等于随机生成的中奖数,即可确定中奖的奖品。
if (names.contains(",")) { nameList = Arrays.asList(names.split(",")); noMatchList.addAll(nameList); // 获取重复内容 Map<String, Integer> map = new HashMap<>(); for (String str : nameList) { int i = 1; if (map.get(str) != null) { i = map.get(str) + 1; } map.put(str, i); } for (String s : map.keySet()) { if (map.get(s) > 1) { repeatList.add(s); repeatSize += map.get(s) - 1; } } } else { nameList.add(names); noMatchList.addAll(nameList); }优化代码
根据您提供的代码,我看到其中可以进行如下优化:
1. 可以使用Java 8的Stream API替代for循环,使代码更加简洁,同时也提高了可读性。
2. 可以使用Java 8的Optional类来简化代码。
下面是优化后的代码:
```
List<String> nameList = Arrays.asList(names.split(","));
noMatchList.addAll(nameList);
// 获取重复内容
Map<String, Long> map = nameList.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));
List<String> repeatList = map.entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList());
int repeatSize = repeatList.stream().mapToInt(s -> Math.toIntExact(map.get(s) - 1)).sum();
```
注:由于不知道您代码中的数据类型,上面的代码仅供参考。
阅读全文