我有這個代碼
public String calculateShippingEstimateDate(LocalDateTime initialDate, Integer totalDaysToAdd, SaveOrderSourceData saveOrderSourceData) {
int workDays = totalDaysToAdd;
LocalDateTime finalDate = LocalDateTime.of(initialDate.getYear(),
initialDate.getMonth(),
initialDate.getDayOfMonth(),
initialDate.getHour(),
initialDate.getMinute(),
initialDate.getSecond());
while (workDays > 0) {
finalDate = finalDate.plusDays(1);
if (!(
DateUtility.isWeekend(finalDate.getDayOfWeek())
|| checkHolidays(saveOrderSourceData, finalDate)
)) {
workDays--;
}
}
return finalDate.toString();
}
private boolean checkHolidays(SaveOrderSourceData saveOrderSourceData, LocalDateTime finalDate) {
return saveOrderSourceData.getHolidays()
.stream().anyMatch(holiday -> getHoliday(holiday).isEqual(finalDate.toLocalDate()));
}
private LocalDate getHoliday(Holiday holiday){
return LocalDate.of(holiday.getYear(),holiday.getMonth(), holiday.getDay());
}
重要的是要知道此示例的estimateDate 等于initialDate 之后的五天。
我們有一個等于 finalDate 的 initialDate(15/02/2022)。
我們進入 while 回圈,它驗證作業日(在此迭代中為 5)是否為 0,它是錯誤的,所以 finalDate 增加它的值,它驗證日期(16/02/2022)是周末還是假期等,當 finalDate 等于 (19/02/2022) 時,它不會減少 workDays 的值。最后當finalDate是(21/02/2022)workDays等于0,而finalDate是星期一,所以while回圈結束。
假期班
import lombok.Builder;
import lombok.Data;
@Data
@Builder(toBuilder = true)
public class Holiday {
private final String id;
private final int year;
private final int month;
private final int day;
}
DateUtility 類
import java.time.DayOfWeek;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import static java.time.DayOfWeek.SATURDAY;
import static java.time.DayOfWeek.SUNDAY;
public class DateUtility {
private DateUtility() {
}
public static boolean isWeekend(DayOfWeek dayOfWeek) {
return SATURDAY.equals(dayOfWeek)
|| SUNDAY.equals(dayOfWeek);
}
}
SaveOrderSourceData 類
@Data
@Builder(toBuilder = true)
public class SaveOrderSourceData {
private final List<Holiday> holidays;
}
uj5u.com熱心網友回復:
這將相當于你的while回圈。
iterate()以initialDate.plusDays(1)種子為種子,并根據 UnaryOperator 生成新元素date -> date.plusDays(1);filter()- 在流中只生活作業日(假設DateUtility并checkHolidays()正確地在那里作業);limit()- 顧名思義,將流中的元素數量限制為給定值(注意,limit()在過濾掉周末或節假日時應用);max()- 產生可選的結果,可選的可能是空initialDate的,并且給定范圍是周末或節假日的所有其他天,在這種情況下流將是空的;map()- 如果值存在,則應用于可選;orElse()- 提供一個替代值(以及在您的實作中,initialDate如果沒有找到進一步的日期,它將回傳)。
public String calculateShippingEstimateDate(LocalDateTime initialDate,
Integer totalDaysToAdd,
SaveOrderSourceData saveOrderSourceData) {
return Stream.iterate(initialDate.plusDays(1), date -> date.plusDays(1))
.filter(date -> !(DateUtility.isWeekend(date.getDayOfWeek())
|| checkHolidays(saveOrderSourceData, date)))
.limit(totalDaysToAdd)
.max(Comparator.naturalOrder())
.map(LocalDateTime::toString)
.orElse(initialDate.toString());
}
我已經用你的實用程式類測驗了這個解決方案,它產生的結果與你的命令式實作相同
public static void main(String[] args) {
System.out.println(new LDTUtil().getShippingDateLoop(LocalDateTime.now(), 5, SaveOrderSourceData.builder().holidays(List.<Holiday>of()).build()));
System.out.println(new LDTUtil().getShippingDateLoop(LocalDateTime.now(), 5, SaveOrderSourceData.builder().holidays(List.<Holiday>of()).build()) "\n");
System.out.println(new LDTUtil().getShippingDateLoop(LocalDateTime.now(), 27, SaveOrderSourceData.builder().holidays(List.of(Holiday.builder().id("id1").year(2022).month(3).day(3).build())).build()));
System.out.println(new LDTUtil().getShippingDateLoop(LocalDateTime.now(), 27, SaveOrderSourceData.builder().holidays(List.of(Holiday.builder().id("id1").year(2022).month(3).day(3).build())).build()));
}
輸出
2022-02-22T21:43:25
2022-02-22T21:43:25
2022-03-25T21:43:25
2022-03-25T21:43:25
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/424447.html
上一篇:正確使用dowhile回圈?
