From 1d6e44ab04cc007e34c09191cd77517795cbd8ca Mon Sep 17 00:00:00 2001 From: stsypanov Date: Tue, 16 Jul 2019 20:45:21 +0300 Subject: [PATCH] Use StringJoiner where possible to simplify String joining Closes gh-23300 --- .../core/style/DefaultValueStyler.java | 60 ++++----- .../org/springframework/util/ObjectUtils.java | 123 +++++------------- .../core/style/DefaultValueStylerTest.java | 99 ++++++++++++++ 3 files changed, 155 insertions(+), 127 deletions(-) create mode 100644 spring-core/src/test/java/org/springframework/core/style/DefaultValueStylerTest.java diff --git a/spring-core/src/main/java/org/springframework/core/style/DefaultValueStyler.java b/spring-core/src/main/java/org/springframework/core/style/DefaultValueStyler.java index 96cb4c9505..a627e6f234 100644 --- a/spring-core/src/main/java/org/springframework/core/style/DefaultValueStyler.java +++ b/spring-core/src/main/java/org/springframework/core/style/DefaultValueStyler.java @@ -18,10 +18,10 @@ package org.springframework.core.style; import java.lang.reflect.Method; import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.StringJoiner; import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; @@ -82,20 +82,15 @@ public class DefaultValueStyler implements ValueStyler { } private String style(Map value) { - StringBuilder result = new StringBuilder(value.size() * 8 + 16); - result.append(MAP + "["); - for (Iterator> it = value.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = it.next(); - result.append(style(entry)); - if (it.hasNext()) { - result.append(',').append(' '); - } - } if (value.isEmpty()) { - result.append(EMPTY); + return MAP + '[' + EMPTY + ']'; + } + + StringJoiner result = new StringJoiner(", ", "[", "]"); + for (Map.Entry entry : value.entrySet()) { + result.add(style(entry)); } - result.append("]"); - return result.toString(); + return MAP + result; } private String style(Map.Entry value) { @@ -103,19 +98,17 @@ public class DefaultValueStyler implements ValueStyler { } private String style(Collection value) { - StringBuilder result = new StringBuilder(value.size() * 8 + 16); - result.append(getCollectionTypeString(value)).append('['); - for (Iterator i = value.iterator(); i.hasNext();) { - result.append(style(i.next())); - if (i.hasNext()) { - result.append(',').append(' '); - } - } + String collectionType = getCollectionTypeString(value); + if (value.isEmpty()) { - result.append(EMPTY); + return collectionType + '[' + EMPTY + ']'; } - result.append("]"); - return result.toString(); + + StringJoiner result = new StringJoiner(", ", "[", "]"); + for (Object o : value) { + result.add(style(o)); + } + return collectionType + result; } private String getCollectionTypeString(Collection value) { @@ -131,20 +124,15 @@ public class DefaultValueStyler implements ValueStyler { } private String styleArray(Object[] array) { - StringBuilder result = new StringBuilder(array.length * 8 + 16); - result.append(ARRAY + "<").append(ClassUtils.getShortName(array.getClass().getComponentType())).append(">["); - for (int i = 0; i < array.length - 1; i++) { - result.append(style(array[i])); - result.append(',').append(' '); - } - if (array.length > 0) { - result.append(style(array[array.length - 1])); + if (array.length == 0) { + return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + '[' + EMPTY + ']'; } - else { - result.append(EMPTY); + + StringJoiner result = new StringJoiner(", ", "[", "]"); + for (Object o : array) { + result.add(style(o)); } - result.append("]"); - return result.toString(); + return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + result; } } diff --git a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java index f8497cd46c..53a0d2b614 100644 --- a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java @@ -734,19 +734,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - - sb.append(array[i]); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (boolean b : array) { + sj.add(String.valueOf(b)); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } /** @@ -766,18 +758,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - sb.append(array[i]); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (byte b : array) { + sj.add(String.valueOf(b)); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } /** @@ -797,18 +782,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - sb.append("'").append(array[i]).append("'"); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (char c : array) { + sj.add('\'' + String.valueOf(c) + '\''); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } /** @@ -828,19 +806,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - - sb.append(array[i]); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (double d : array) { + sj.add(String.valueOf(d)); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } /** @@ -860,19 +830,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - - sb.append(array[i]); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (float f : array) { + sj.add(String.valueOf(f)); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } /** @@ -892,18 +854,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - sb.append(array[i]); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (int i : array) { + sj.add(String.valueOf(i)); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } /** @@ -923,18 +878,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - sb.append(array[i]); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (long l : array) { + sj.add(String.valueOf(l)); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } /** @@ -954,18 +902,11 @@ public abstract class ObjectUtils { if (length == 0) { return EMPTY_ARRAY; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i == 0) { - sb.append(ARRAY_START); - } - else { - sb.append(ARRAY_ELEMENT_SEPARATOR); - } - sb.append(array[i]); + StringJoiner sj = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END); + for (short s : array) { + sj.add(String.valueOf(s)); } - sb.append(ARRAY_END); - return sb.toString(); + return sj.toString(); } } diff --git a/spring-core/src/test/java/org/springframework/core/style/DefaultValueStylerTest.java b/spring-core/src/test/java/org/springframework/core/style/DefaultValueStylerTest.java new file mode 100644 index 0000000000..ee026babc6 --- /dev/null +++ b/spring-core/src/test/java/org/springframework/core/style/DefaultValueStylerTest.java @@ -0,0 +1,99 @@ +package org.springframework.core.style; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DefaultValueStylerTest { + + private DefaultValueStyler styler = new DefaultValueStyler(); + + @Test + public void style() throws NoSuchMethodException { + assertThat(styler.style(null)).isEqualTo("[null]"); + + assertThat(styler.style("str")).isEqualTo("'str'"); + + assertThat(styler.style(String.class)).isEqualTo("String"); + + assertThat(styler.style(String.class.getMethod("toString"))).isEqualTo("toString@String"); + } + + @Test + public void style_plainObject() { + final Object obj = new Object(); + + assertThat(styler.style(obj)).isEqualTo(String.valueOf(obj)); + } + + @Test + public void style_map() { + Map map = Collections.emptyMap(); + assertThat(styler.style(map)).isEqualTo("map[[empty]]"); + + map = Collections.singletonMap("key", 1); + assertThat(styler.style(map)).isEqualTo("map['key' -> 1]"); + + map = new HashMap<>(); + map.put("key1", 1); + map.put("key2", 2); + assertThat(styler.style(map)).isEqualTo("map['key1' -> 1, 'key2' -> 2]"); + } + + @Test + public void style_entry() { + final Map map = new LinkedHashMap<>(); + map.put("key1", 1); + map.put("key2", 2); + + final Iterator> entries = map.entrySet().iterator(); + + assertThat(styler.style(entries.next())).isEqualTo("'key1' -> 1"); + assertThat(styler.style(entries.next())).isEqualTo("'key2' -> 2"); + } + + @Test + public void style_collection() { + List list = Collections.emptyList(); + assertThat(styler.style(list)).isEqualTo("list[[empty]]"); + + list = Collections.singletonList(1); + assertThat(styler.style(list)).isEqualTo("list[1]"); + + list = Arrays.asList(1, 2); + assertThat(styler.style(list)).isEqualTo("list[1, 2]"); + } + + @Test + public void style_primitiveArray() { + int[] array = new int[0]; + assertThat(styler.style(array)).isEqualTo("array[[empty]]"); + + array = new int[]{1}; + assertThat(styler.style(array)).isEqualTo("array[1]"); + + array = new int[]{1, 2}; + assertThat(styler.style(array)).isEqualTo("array[1, 2]"); + } + + @Test + public void style_objectArray() { + String[] array = new String[0]; + assertThat(styler.style(array)).isEqualTo("array[[empty]]"); + + array = new String[]{"str1"}; + assertThat(styler.style(array)).isEqualTo("array['str1']"); + + array = new String[]{"str1", "str2"}; + assertThat(styler.style(array)).isEqualTo("array['str1', 'str2']"); + } + +} \ No newline at end of file -- GitLab