diff --git a/spring-context/src/main/java/org/springframework/validation/DefaultMessageCodesResolver.java b/spring-context/src/main/java/org/springframework/validation/DefaultMessageCodesResolver.java index 768ee03a52..15655c1cc7 100644 --- a/spring-context/src/main/java/org/springframework/validation/DefaultMessageCodesResolver.java +++ b/spring-context/src/main/java/org/springframework/validation/DefaultMessageCodesResolver.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import java.util.StringJoiner; import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; @@ -242,11 +243,10 @@ public class DefaultMessageCodesResolver implements MessageCodesResolver, Serial * null elements altogether. */ public static String toDelimitedString(String... elements) { - StringBuilder rtn = new StringBuilder(); + StringJoiner rtn = new StringJoiner(CODE_SEPARATOR); for (String element : elements) { if (StringUtils.hasLength(element)) { - rtn.append(rtn.length() == 0 ? "" : CODE_SEPARATOR); - rtn.append(element); + rtn.add(element); } } return rtn.toString(); diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/CollectionToStringConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/CollectionToStringConverter.java index f6d52cf2db..2bef4df2e8 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/CollectionToStringConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/CollectionToStringConverter.java @@ -19,6 +19,7 @@ package org.springframework.core.convert.support; import java.util.Collection; import java.util.Collections; import java.util.Set; +import java.util.StringJoiner; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; @@ -64,18 +65,13 @@ final class CollectionToStringConverter implements ConditionalGenericConverter { if (sourceCollection.isEmpty()) { return ""; } - StringBuilder sb = new StringBuilder(); - int i = 0; + StringJoiner sj = new StringJoiner(DELIMITER); for (Object sourceElement : sourceCollection) { - if (i > 0) { - sb.append(DELIMITER); - } Object targetElement = this.conversionService.convert( sourceElement, sourceType.elementTypeDescriptor(sourceElement), targetType); - sb.append(targetElement); - i++; + sj.add(String.valueOf(targetElement)); } - return sb.toString(); + return sj.toString(); } } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/AbstractMessageCondition.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/AbstractMessageCondition.java index f12370dca4..5abc6822d0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/AbstractMessageCondition.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/AbstractMessageCondition.java @@ -18,6 +18,7 @@ package org.springframework.messaging.handler; import java.util.Collection; import java.util.Iterator; +import java.util.StringJoiner; import org.springframework.lang.Nullable; @@ -51,16 +52,11 @@ public abstract class AbstractMessageCondition iterator = getContent().iterator(); iterator.hasNext();) { - Object expression = iterator.next(); - builder.append(expression.toString()); - if (iterator.hasNext()) { - builder.append(getToStringInfix()); - } + StringJoiner joiner = new StringJoiner(getToStringInfix(), "[", "]"); + for (Object expression : getContent()) { + joiner.add(expression.toString()); } - builder.append("]"); - return builder.toString(); + return joiner.toString(); } diff --git a/spring-web/src/main/java/org/springframework/http/HttpRange.java b/spring-web/src/main/java/org/springframework/http/HttpRange.java index c1025ac1df..520094d456 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpRange.java +++ b/spring-web/src/main/java/org/springframework/http/HttpRange.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.StringJoiner; import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; @@ -210,13 +211,9 @@ public abstract class HttpRange { */ public static String toString(Collection ranges) { Assert.notEmpty(ranges, "Ranges Collection must not be empty"); - StringBuilder builder = new StringBuilder(BYTE_RANGE_PREFIX); - for (Iterator iterator = ranges.iterator(); iterator.hasNext(); ) { - HttpRange range = iterator.next(); - builder.append(range); - if (iterator.hasNext()) { - builder.append(", "); - } + StringJoiner builder = new StringJoiner(", ", BYTE_RANGE_PREFIX, ""); + for (HttpRange range : ranges) { + builder.add(range.toString()); } return builder.toString(); } diff --git a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java index 172c7fed87..0c2a9def4e 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.StringJoiner; import java.util.function.BiFunction; import java.util.function.UnaryOperator; @@ -916,14 +917,10 @@ final class HierarchicalUriComponents extends UriComponents { @Override public String getPath() { - StringBuilder pathBuilder = new StringBuilder(); - pathBuilder.append(PATH_DELIMITER); - for (Iterator iterator = this.pathSegments.iterator(); iterator.hasNext(); ) { - String pathSegment = iterator.next(); - pathBuilder.append(pathSegment); - if (iterator.hasNext()) { - pathBuilder.append(PATH_DELIMITER); - } + String delimiter = String.valueOf(PATH_DELIMITER); + StringJoiner pathBuilder = new StringJoiner(delimiter, delimiter, ""); + for (String pathSegment : this.pathSegments) { + pathBuilder.add(pathSegment); } return pathBuilder.toString(); }