Rename split-loop-with-lambda to slice-with-lambda
The refactoring is now published as Slice on sammancoaching.org: https://sammancoaching.org/refactorings/slice.html - git mv ideas/split-loop-with-lambda -> ideas/slice-with-lambda - rename learning-hour file and update frontmatter name - update paths in tools/rehearse scripts and report title - update prose: 'Split Loop with Lambda' -> 'Slice with Lambda' in learning hour, exercise READMEs, storyboard, solution comments - link the published Slice refactoring from the pattern draft
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
|
||||
|
||||
## 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<Boolean>`) at top of method; replaced `scorer.lookupWeather(daysForward)` with `dayOffsetToWeather.apply(daysForward)` |
|
||||
| **2** | Extracted weather-collection loop into new private method `collectExpectedWeather(List<Instant>, LongFunction<Boolean>)` |
|
||||
| **3** | Removed `String quarter` parameter, added no-arg overload `longRangeForecast()` that wraps `scorer` in a lambda and delegates to `longRangeForecast(LongFunction<Boolean>)` |
|
||||
|
||||
### 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<IceCream, Integer> longRangeForecast(String quarter) {
|
||||
+ public Map<IceCream, Integer> longRangeForecast() {
|
||||
+ return longRangeForecast(dayOffset -> scorer.lookupWeather(dayOffset));
|
||||
+ }
|
||||
+
|
||||
+ public Map<IceCream, Integer> longRangeForecast(LongFunction<Boolean> dayOffsetToWeather) {
|
||||
|
||||
var result = new HashMap<IceCream, Integer>();
|
||||
- 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<Instant> interestingDates = List.of(...);
|
||||
- List<Boolean> expectedWeather = new ArrayList<>();
|
||||
- for (...) {
|
||||
- scorer.updateSelection();
|
||||
- ...
|
||||
- Boolean lookupWeather = scorer.lookupWeather(daysForward);
|
||||
- expectedWeather.add(lookupWeather);
|
||||
- }
|
||||
+ List<Boolean> expectedWeather = collectExpectedWeather(interestingDates, dayOffsetToWeather);
|
||||
|
||||
@@ -46,4 +37,16 @@
|
||||
}
|
||||
return result;
|
||||
}
|
||||
+
|
||||
+ private List<Boolean> collectExpectedWeather(List<Instant> interestingDates,
|
||||
+ LongFunction<Boolean> dayOffsetToWeather) {
|
||||
+ List<Boolean> 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.
|
||||
Reference in New Issue
Block a user