首先,Answer by rzwitserloot 中的两点都是正确且明智的:
- 禁止使用外部库意味着错过了使用 Java 的最佳理由:其庞大而丰富的支持库生态系统。
- 为您的工作使用 java.time 类,例如
LocalDate。切勿使用旧的日期时间类,例如 Date 或 Calendar。
具体来说,我建议添加ThreeTen-Extra 库以利用其LocalDateRange 类来包含一对LocalDate 对象。该类提供了方便的方法,例如abuts、overlaps、contains 等。
我建议您通过使用半开放方法定义一个时间跨度来完成所有日期处理,其中开始是包含而结束是独占 .因此,该月从第一个月开始,一直持续到但不包括接下来几个月的第一个月。 6 月为 6 月 1 日至 7 月 1 日。LocalDateRange 默认使用半开,但如果您坚持,也可以适应全封闭(包括开头和结尾)。
在 Java 16 及更高版本中,使用 records 功能定义一个类以透明且不可变地保存您的数据。您只需声明每个成员字段的类型和名称。编译器隐式创建默认构造函数、getter、equals & hashCode 和toString。额外功能:除了嵌套或单独(同上enum 和interface),还可以在本地定义记录。
所以你的整个班级只有一条短线:
record CovidDaily ( String isoCode , String continent , String location, LocalDate date , … ) {}
过滤行、循环或使用流。
LocalDate start = LocalDate.of( 2021 , Month.JUNE , 1 ) ;
LocalDate end = LocalDate.of( 2021 , Month.JULY , 1 ) ;
List< CovidDaily > hits = new ArrayList<>() ;
List< CovidDaily > dailies = … ;
for( CovidDaily covidDaily: dailies )
{
LocalDate ld = covidDaily.date() ;
if( ( ! ld.isBefore( start ) ) && ( ld.isBefore( end ) )
{ hits.add( covidDaily) ; } // Else ignore this record and move on to next.
}
通常最好返回不可修改的结果。
return List.copyOf( hits ) ;
流式方法更短。
LocalDate start = LocalDate.of( 2021 , Month.JUNE , 1 ) ;
LocalDate end = LocalDate.of( 2021 , Month.JULY , 1 ) ;
List< CovidDaily > dailies = … ;
return dailies.stream().filter( covidDaily -> ( ! covidDaily.date().isBefore( start ) ) && ( covidDaily.date().isBefore( end ) ) ).toList();
使用LocalDateRange。
LocalDateRange range = LocalDateRange.of(
LocalDate.of( 2021 , Month.JUNE , 1 ) ,
LocalDate.of( 2021 , Month.JULY , 1 ) ) ;
List< CovidDaily > dailies = … ;
return dailies.stream().filter( covidDaily -> range.contains( covidDaily.date() ) ).toList();