Java – 日期流
原文: https://howtodoinjava.com/java9/stream-dates-datesuntil/
对于 Java 开发人员而言,日期和时间处理一直是一个痛苦的领域。 Java 8 中添加的新的 Date-Time API 更改了在 Java 中与日期进行交互的方式。 这是一项非常强大且急需的改进。 唯一缺少的是获得日期的流,在两个后续日期之间存在一些共同的差异(尽管有可能,但没有简便的方法)。
Java 9 引入了一种新方法LocalDate.datesUntil()
,该方法可以提供日期流。 使用datesUntil()
可以轻松创建具有固定偏移量的日期流。
1. LocalDate.datesUntil()
的语法
此方法有两种重载形式:
Stream<LocalDate> datesUntil(LocalDate end)
Stream<LocalDate> datesUntil(LocalDate end, Period step)
第一个版本(即不带Period
)内部调用带有Period.ofDays(1)
的第二个方法,并生成日期流,两者之间相差 1 天。
使用LocalDate.datesUntil()
的日期流示例
创建日期流非常简单明了。
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
import java.util.stream.Collectors;
public class Java9StreamExamples {
public static void main(String[] args) {
System.out.println( getDaysInJava9(LocalDate.now(), LocalDate.now().plusDays(10)) );
System.out.println( getDaysInJava9Weeks(LocalDate.now(), LocalDate.now().plusWeeks(10)) );
}
//Stream of dates with 1 day difference
public static List<LocalDate> getDaysInJava9(LocalDate start, LocalDate end) {
return start.datesUntil(end).collect(Collectors.toList());
}
//Stream of dates with 1 week difference
public static List<LocalDate> getDaysInJava9Weeks(LocalDate start, LocalDate end) {
return start.datesUntil(end, Period.ofWeeks(1)).collect(Collectors.toList());
}
}
Output:
[2017-07-31, 2017-08-01, 2017-08-02, 2017-08-03, 2017-08-04,
2017-08-05, 2017-08-06, 2017-08-07, 2017-08-08, 2017-08-09]
[2017-07-31, 2017-08-07, 2017-08-14, 2017-08-21, 2017-08-28,
2017-09-04, 2017-09-11, 2017-09-18, 2017-09-25, 2017-10-02]
2. Java 8 中的日期流
如果您仍未使用 Java 9,则可以使用以下给定的方法生成 Date 流。 该代码与 Java 8 兼容。
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Java9StreamExamples {
public static void main(String[] args)
{
System.out.println( getDaysInJava8(LocalDate.now(), 10) );
}
//Stream of dates with 1 day difference
public static List<LocalDate> getDaysInJava8(LocalDate start, int days)
{
return Stream.iterate(start, date -> date.plusDays(1))
.limit(days)
.collect(Collectors.toList());
}
}
Output:
[2017-07-31, 2017-08-01, 2017-08-02, 2017-08-03, 2017-08-04,
2017-08-05, 2017-08-06, 2017-08-07, 2017-08-08, 2017-08-09]
将我的问题放在评论部分。
学习愉快!