import java.time.format.DateTimeFormatter;
import java.time.YearMonth;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Main {
public static void main
(String[] args
) { Map
<String, Long
> expectedValues
= new HashMap
<>(); expectedValues.put("2021-06-01", 10L);
expectedValues.put("2021-07-01", 20L);
expectedValues.put("2021-08-01", 30L);
expectedValues = transform(expectedValues);
// Show the map, sorted by date
expectedValues.entrySet().stream()
.
forEach(e
-> System.
out.
println(e.
getKey() + ": " + e.
getValue())); }
private static Map
<String, Long
> transform
(Map
<String, Long
> expectedValues
) { DateTimeFormatter format = DateTimeFormatter.ISO_LOCAL_DATE;
return Stream.iterate(YearMonth.now(), ym -> ym.minusMonths(1))
.limit(12)
.map(ym -> ym.atDay(1).format(format))
.
map(str
-> Map.
entry(str, expectedValues.
getOrDefault(str, 0L
))) }
}
aW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CmltcG9ydCBqYXZhLnRpbWUuWWVhck1vbnRoOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CgpjbGFzcyBNYWluIHsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlNYXA8U3RyaW5nLCBMb25nPiBleHBlY3RlZFZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKCQlleHBlY3RlZFZhbHVlcy5wdXQoIjIwMjEtMDYtMDEiLCAxMEwpOwoJCWV4cGVjdGVkVmFsdWVzLnB1dCgiMjAyMS0wNy0wMSIsIDIwTCk7CgkJZXhwZWN0ZWRWYWx1ZXMucHV0KCIyMDIxLTA4LTAxIiwgMzBMKTsKCQkKCQlleHBlY3RlZFZhbHVlcyA9IHRyYW5zZm9ybShleHBlY3RlZFZhbHVlcyk7CgkJCgkJLy8gU2hvdyB0aGUgbWFwLCBzb3J0ZWQgYnkgZGF0ZQoJCWV4cGVjdGVkVmFsdWVzLmVudHJ5U2V0KCkuc3RyZWFtKCkKCQkgICAgLnNvcnRlZChNYXAuRW50cnkuY29tcGFyaW5nQnlLZXkoKSkKCQkgICAgLmZvckVhY2goZSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRLZXkoKSArICI6ICIgKyBlLmdldFZhbHVlKCkpKTsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTG9uZz4gdHJhbnNmb3JtKE1hcDxTdHJpbmcsIExvbmc+IGV4cGVjdGVkVmFsdWVzKSB7CgkJRGF0ZVRpbWVGb3JtYXR0ZXIgZm9ybWF0ID0gRGF0ZVRpbWVGb3JtYXR0ZXIuSVNPX0xPQ0FMX0RBVEU7CgkJcmV0dXJuIFN0cmVhbS5pdGVyYXRlKFllYXJNb250aC5ub3coKSwgeW0gLT4geW0ubWludXNNb250aHMoMSkpCgkJICAgIC5saW1pdCgxMikKCQkgICAgLm1hcCh5bSAtPiB5bS5hdERheSgxKS5mb3JtYXQoZm9ybWF0KSkKCQkgICAgLm1hcChzdHIgLT4gTWFwLmVudHJ5KHN0ciwgZXhwZWN0ZWRWYWx1ZXMuZ2V0T3JEZWZhdWx0KHN0ciwgMEwpKSkKCQkgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChNYXAuRW50cnk6OmdldEtleSwgTWFwLkVudHJ5OjpnZXRWYWx1ZSkpOwoJfQp9