diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapter.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapter.java index fcd4f8e0ea4b..10040b8f0145 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapter.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapter.java @@ -18,10 +18,10 @@ import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.function.Function; +import java.util.stream.Collectors; import org.springframework.util.Assert; @@ -37,34 +37,30 @@ */ abstract class NamedContributorsMapAdapter implements NamedContributors { - private final Map namedContributorsMap; + private final Map map; NamedContributorsMapAdapter(Map map, Function valueAdapter) { Assert.notNull(map, "Map must not be null"); Assert.notNull(valueAdapter, "ValueAdapter must not be null"); - this.namedContributorsMap = getContributorsMap(map, valueAdapter); - } - - private Map getContributorsMap(Map map, Function valueAdapter) { - Map contributorsMap = new LinkedHashMap<>(map.size()); - map.forEach((name, value) -> { - this.validateKey(name); - C contributor = adapt(value, valueAdapter); - Assert.notNull(contributor, "Map must not contain null values"); - contributorsMap.put(name, contributor); - }); - return Collections.unmodifiableMap(contributorsMap); + map.keySet().forEach(this::validateKey); + this.map = Collections.unmodifiableMap(map.entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, (entry) -> adapt(entry.getValue(), valueAdapter)))); } private void validateKey(String value) { Assert.notNull(value, "Map must not contain null keys"); Assert.isTrue(!value.contains("/"), "Map keys must not contain a '/'"); + } + private C adapt(V value, Function valueAdapter) { + C contributor = (value != null) ? valueAdapter.apply(value) : null; + Assert.notNull(contributor, "Map must not contain null values"); + return contributor; } @Override public Iterator> iterator() { - Iterator> iterator = this.namedContributorsMap.entrySet().iterator(); + Iterator> iterator = this.map.entrySet().iterator(); return new Iterator>() { @Override @@ -83,11 +79,7 @@ public NamedContributor next() { @Override public C getContributor(String name) { - return this.namedContributorsMap.get(name); - } - - private C adapt(V value, Function valueAdapter) { - return (value != null) ? valueAdapter.apply(value) : null; + return this.map.get(name); } } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapterTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapterTests.java index 9e6a23bdb6a0..c33214ef1db8 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapterTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/NamedContributorsMapAdapterTests.java @@ -32,6 +32,7 @@ * Tests for {@link NamedContributorsMapAdapter}. * * @author Phillip Webb + * @author Guirong Hu */ class NamedContributorsMapAdapterTests { @@ -94,12 +95,11 @@ void getContributorReturnsAdaptedEntry() { } @Test - void eachValueAdapterShouldBeCalledOnlyOnce() { + void getContributorCallsAdaptersOnlyOnce() { Map map = new LinkedHashMap<>(); map.put("one", "one"); map.put("two", "two"); int callCount = map.size(); - AtomicInteger counter = new AtomicInteger(0); TestNamedContributorsMapAdapter adapter = new TestNamedContributorsMapAdapter<>(map, (name) -> count(name, counter));