public class DateUtils { public static List<YearMonth> getMonthsBetween(LocalDate start, LocalDate end) { List<YearMonth> months = new ArrayList<>(); long monthsBetween = ChronoUnit.MONTHS.between(start.withDayOfMonth(1), end.withDayOfMonth(1)); for (int i = 0; i <= monthsBetween; i++) { YearMonth yearMonth = YearMonth.from(start.withDayOfMonth(1).plusMonths(i)); months.add(yearMonth); } return months; } }
时间: 2024-04-27 09:25:10 浏览: 90
这段代码定义了一个名为DateUtils的类,其中包含一个名为getMonthsBetween的静态方法,该方法接受两个LocalDate类型的参数:start和end,表示日期范围的开始和结束。
该方法返回一个List<YearMonth>类型的列表,其中包含了从开始日期到结束日期之间的所有月份。
在方法内部,首先通过使用ChronoUnit类的MONTHS常量计算出开始日期和结束日期之间的月份数。然后,使用for循环遍历每一个月份,并使用YearMonth类的from方法将LocalDate类型的日期转换为YearMonth类型的月份,最后将所有月份添加到列表中,并返回该列表。
相关问题
优化这段代码 Map<String, List<PositionInfo>> resultMap ; List<String> allRows = this.getHBaseRows(); if (CollectionUtils.isEmpty(allRows)) { return success(new HashMap<>(1)); } // 数据转换 List<PositionInfo> allInfos = allRows.stream() .map(ar -> JSONObject.parseObject(ar, PositionInfo.class)) .filter(ar -> ar.getTimestamp() > DateUtils.addHours(new Date(), -1).getTime()) .collect(Collectors.toList()); // 获取每个用户最近一次的记录 List<PositionInfo> result = new ArrayList<>(allInfos.stream() .collect(Collectors.toMap(PositionInfo::getUserId, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(PositionInfo::getTimestamp)))) .values()); switch (homeQueryCondition.getCityIndex()) { case 0: resultMap = result.stream().collect(Collectors.groupingBy(PositionInfo::getProvince)); break; case 1: resultMap = result.stream().filter(ar -> homeQueryCondition.getProvince().equals(ar.getProvince())) .collect(Collectors.groupingBy(PositionInfo::getCity)); break; case 2: resultMap = result.stream().filter(ar -> homeQueryCondition.getCity().equals(ar.getCity())) .collect(Collectors.groupingBy(PositionInfo::getCounty)); break; default: resultMap = new HashMap<>(1); }
这段代码的主要功能是在 HBase 数据库中查询用户位置信息,并对查询结果进行转换和分组,最终返回一个 Map,其中键是用户的位置信息,值是对应位置的用户信息列表。
以下是一些优化建议:
1. 避免使用过多的中间变量,可以直接将查询结果转换成 Map。
2. 简化代码逻辑,可以使用 if-else 语句替换 switch 语句。
3. 对于大数据集,使用并行流处理可以提高处理效率。
下面是优化后的代码示例:
```
List<String> allRows = this.getHBaseRows();
if (CollectionUtils.isEmpty(allRows)) {
return success(new HashMap<>(1));
}
// 将查询结果转换成 Map,键为用户 ID,值为用户位置信息列表
Map<String, List<PositionInfo>> allInfosMap = allRows.parallelStream()
.map(ar -> JSONObject.parseObject(ar, PositionInfo.class))
.filter(ar -> ar.getTimestamp() > DateUtils.addHours(new Date(), -1).getTime())
.collect(Collectors.groupingBy(PositionInfo::getUserId));
// 获取每个用户最近一次的记录,转换成列表
List<PositionInfo> result = allInfosMap.values().stream()
.map(positionInfos -> positionInfos.stream()
.max(Comparator.comparing(PositionInfo::getTimestamp))
.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 根据查询条件进行分组
if (homeQueryCondition.getCityIndex() == 0) {
resultMap = result.stream()
.collect(Collectors.groupingBy(PositionInfo::getProvince));
} else if (homeQueryCondition.getCityIndex() == 1) {
resultMap = result.stream()
.filter(ar -> homeQueryCondition.getProvince().equals(ar.getProvince()))
.collect(Collectors.groupingBy(PositionInfo::getCity));
} else if (homeQueryCondition.getCityIndex() == 2) {
resultMap = result.stream()
.filter(ar -> homeQueryCondition.getCity().equals(ar.getCity()))
.collect(Collectors.groupingBy(PositionInfo::getCounty));
} else {
resultMap = new HashMap<>(1);
}
```
优化这段代码:private PreRankVo getpreRankVo(String type,String elementType){ ExtremeElement extremeElement = extremeElementMapper.searchOne(TimescaleEnum.HOUR.getCode(), LatestDataElementEnum.PRE_1H.getElementType(), 1); PreRankVo preRankVo = new PreRankVo(); if(Objects.nonNull(extremeElement)) { List<ExtremeData> extremeData1 = extremeDataService.searchList(extremeElement, FilterEnums.GE.getCode()); List<ExtremeData> extremeData = extremeData1.stream().sorted(Comparator.comparing(ExtremeData::getExtremeRank)).limit(5).collect(Collectors.toList()); List<ExtremeRankVo> extremeRankVos = new ArrayList<>(); for (ExtremeData extremeDatum : extremeData) { ExtremeRankVo extremeRankVo = new ExtremeRankVo(); extremeRankVo.setRank(extremeDatum.getExtremeRank()); extremeRankVo.setValue(extremeDatum.getExtremeValue()); SysStationInfo sysStationInfo = stationInfoMapper.selectById(extremeDatum.getStationId()); extremeRankVo.setStationName(sysStationInfo.getStationName()); if(type.equals("0")){ extremeRankVo.setTime(DateUtils.formatLocalDateTime(extremeDatum.getExtremeTime(),DateUtils.DEFAULT_DATE_FORMAT)); }else { extremeRankVo.setTime(DateUtils.formatLocalDateTime(extremeDatum.getExtremeTime(),DateUtils.DATE_TIME_09)); } extremeRankVos.add(extremeRankVo); } preRankVo.setExtremeRankVo(extremeRankVos); preRankVo.setType(type); } return preRankVo; }
以下是优化后的代码:
```java
private PreRankVo getpreRankVo(String type, String elementType) {
ExtremeElement extremeElement = extremeElementMapper.searchOne(TimescaleEnum.HOUR.getCode(), LatestDataElementEnum.PRE_1H.getElementType(), 1);
if (extremeElement == null) {
return new PreRankVo();
}
List<ExtremeData> extremeData = extremeDataService.searchList(extremeElement, FilterEnums.GE.getCode()).stream()
.sorted(Comparator.comparing(ExtremeData::getExtremeRank))
.limit(5)
.collect(Collectors.toList());
List<ExtremeRankVo> extremeRankVos = extremeData.stream()
.map(extremeDatum -> {
ExtremeRankVo extremeRankVo = new ExtremeRankVo();
extremeRankVo.setRank(extremeDatum.getExtremeRank());
extremeRankVo.setValue(extremeDatum.getExtremeValue());
SysStationInfo sysStationInfo = stationInfoMapper.selectById(extremeDatum.getStationId());
extremeRankVo.setStationName(sysStationInfo.getStationName());
extremeRankVo.setTime(type.equals("0") ? DateUtils.formatLocalDateTime(extremeDatum.getExtremeTime(), DateUtils.DEFAULT_DATE_FORMAT)
: DateUtils.formatLocalDateTime(extremeDatum.getExtremeTime(), DateUtils.DATE_TIME_09));
return extremeRankVo;
})
.collect(Collectors.toList());
return new PreRankVo(type, extremeRankVos);
}
```
优化点如下:
1. 将 `if (Objects.nonNull(extremeElement))` 改为 `if (extremeElement == null)`,减少了 `Objects.nonNull` 的调用。
2. 使用方法链式调用的方式简化了代码,将多个操作链接在一起,减少了中间变量的使用。
3. 使用了 Java 8 的流式编程,将排序、限制、映射和收集操作都放在了一起,让代码更加简洁。
4. 使用了三目运算符将 `if...else` 语句简化为一行代码。
阅读全文