使用流,您可以按以下方式进行操作;
@Test
void testStream() {
class DoubleDateObject {
LocalDate d1;
LocalDate d2;
public DoubleDateObject(LocalDate d1, LocalDate d2) {
this.d1 = d1;
this.d2 = d2;
}
@Override
public String toString() {
return "DoubleDateObject{" +
"d1=" + d1 +
", d2=" + d2 +
'}';
}
}
LocalDate[] dates = {LocalDate.now(), LocalDate.now(), LocalDate.now(), LocalDate.now()};
List<DoubleDateObject> ret = IntStream.range(0, dates.length)
.filter(i -> i % 2 == 1)
.mapToObj(i -> new DoubleDateObject(dates[i - 1], dates[i]))
.collect(Collectors.toList());
System.out.println(ret);
}
输出将是;
[DoubleDateObject{d1=2021-09-03, d2=2021-09-03}, DoubleDateObject{d1=2021-09-03, d2=2021-09-03}]
你可以使用下面的flux,它会产生同样的结果;
List<DoubleDateObject> ret = Flux.range(0, dates.length)
.filter(i -> i % 2 == 1)
.map(i -> new DoubleDateObject(dates[i - 1], dates[i]))
.collectList().block();
如果您一开始没有数组,那么您可以执行以下操作,再次产生相同的输出; (将 Arrays.stream(dates) 替换为您的流)
final LocalDate[] tmp = {null};
List<DoubleDateObject> ret = Arrays.stream(dates)
.peek(date -> {
if (tmp[0] == null) tmp[0] = date;
else tmp[0] = null;
})
.filter(date -> tmp[0] == null)
.map(date -> new DoubleDateObject(tmp[0], date))
.collect(Collectors.toList());