## Refactoring Complete — Final Diff Here's the summary of all changes made to `LongRangeForecasts.java`: ### Summary of Changes | Step | What was done | |------|---------------| | **1** | Introduced `dayOffsetToWeather` lambda (`LongFunction`) at top of method; replaced `scorer.lookupWeather(daysForward)` with `dayOffsetToWeather.apply(daysForward)` | | **2** | Extracted weather-collection loop into new private method `collectExpectedWeather(List, LongFunction)` | | **3** | Removed `String quarter` parameter, added no-arg overload `longRangeForecast()` that wraps `scorer` in a lambda and delegates to `longRangeForecast(LongFunction)` | ### Final Diff ```diff @@ -3,36 +3,27 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.function.LongFunction; public class LongRangeForecasts { private final Scorer scorer = new Scorer(); - public Map longRangeForecast(String quarter) { + public Map longRangeForecast() { + return longRangeForecast(dayOffset -> scorer.lookupWeather(dayOffset)); + } + + public Map longRangeForecast(LongFunction dayOffsetToWeather) { var result = new HashMap(); - if (Objects.equals(quarter, "Q1") || Objects.equals(quarter, "Q4")) { - for (IceCream flavour : IceCream.values()) { - result.put(flavour, 5); - } - } - for (IceCream flavour : IceCream.values()) { - result.put(flavour, 0); - } + List interestingDates = List.of(...); - List expectedWeather = new ArrayList<>(); - for (...) { - scorer.updateSelection(); - ... - Boolean lookupWeather = scorer.lookupWeather(daysForward); - expectedWeather.add(lookupWeather); - } + List expectedWeather = collectExpectedWeather(interestingDates, dayOffsetToWeather); @@ -46,4 +37,16 @@ } return result; } + + private List collectExpectedWeather(List interestingDates, + LongFunction dayOffsetToWeather) { + List result = new ArrayList<>(); + for (Instant interestingDate : interestingDates) { + scorer.updateSelection(); + var forecastDate = Instant.parse("2023-04-26T14:00:00.000-07:00"); + long daysForward = ChronoUnit.DAYS.between(forecastDate, interestingDate); + result.add(dayOffsetToWeather.apply(daysForward)); + } + return result; + } } ``` The code **compiles cleanly**. The test fails because the old `longRangeForecast(String)` signature no longer exists — which is expected per the task instructions.