我需要在此代码中使用Java Stream,但是我不知道它如何与空白列表一起使用。
我正在尝试在Stream Java 8中找到类似while
的东西,但找不到。
public static List<DateBucket> bucketize(ZonedDateTime fromDate, ZonedDateTime toDate, int bucketSize, ChronoUnit bucketSizeUnit) {
List<DateBucket> buckets = new ArrayList<>();;
boolean reachedDate = false;
for (int i = 0; !reachedDate; i++) {
ZonedDateTime minDate = fromDate.plus(i * bucketSize, bucketSizeUnit);
ZonedDateTime maxDate = fromDate.plus((i + 1) * bucketSize, bucketSizeUnit);
reachedDate = toDate.isBefore(maxDate);
buckets.add(new DateBucket(minDate.toInstant(), maxDate.toInstant()));
}
return buckets;
}
我希望避免使用for
,并在大部分代码中使用Stream。
答案 0 :(得分:2)
您可以使用LongStream
来启动,mapToObj()
来创建DateBucket
:
public static List<DateBucket> bucketize(ZonedDateTime fromDate, ZonedDateTime toDate, int bucketSize, ChronoUnit bucketSizeUnit) {
return LongStream.rangeClosed(0, bucketSizeUnit.between(fromDate, toDate))
.mapToObj(i -> {
ZonedDateTime minDate = fromDate.plus(i * bucketSize, bucketSizeUnit);
ZonedDateTime maxDate = fromDate.plus((i + 1) * bucketSize, bucketSizeUnit);
return new DateBucket(minDate.toInstant(), maxDate.toInstant());
})
.filter(b -> {
ZonedDateTime maxDate = b.getMaxDate().atZone(toDate.getZone());
ZonedDateTime limitDate = toDate.plus(bucketSize, bucketSizeUnit);
return maxDate.isBefore(limitDate) || maxDate.isEqual(limitDate);
})
.collect(Collectors.toList());
}
这会创建一个从0
到给定日期之间的最大可能索引的IntStream,将每个索引映射到DateBucket
并过滤所需范围的结果。
如果可以使用 Java 9 ,我建议使用IntStream.iterate()
代替Intstream.rangeClosed()
,而使用takeWhile()
代替filter()
:
public static List<DateBucket> bucketize(ZonedDateTime fromDate, ZonedDateTime toDate, int bucketSize, ChronoUnit bucketSizeUnit) {
return LongStream.iterate(0, i -> i + 1)
.mapToObj(i -> {
ZonedDateTime minDate = fromDate.plus(i * bucketSize, bucketSizeUnit);
ZonedDateTime maxDate = fromDate.plus((i + 1) * bucketSize, bucketSizeUnit);
return new DateBucket(minDate.toInstant(), maxDate.toInstant());
})
.takeWhile(b -> {
ZonedDateTime maxDate = b.getMaxDate().atZone(toDate.getZone());
ZonedDateTime limitDate = toDate.plus(bucketSize, bucketSizeUnit);
return maxDate.isBefore(limitDate) || maxDate.isEqual(limitDate);
})
.collect(Collectors.toList());
}
但是这些方法都不会比您已经拥有的解决方案具有更好的性能。