From 2a8356cd433ccbe3338c823ad7c61b6f895cccf2 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 6 Jan 2021 14:40:29 -0500 Subject: [PATCH] Replace StringBuilder with StringJoiner in join() APIs. --- .../org/apache/commons/lang3/StringUtils.java | 331 ++++++++---------- 1 file changed, 137 insertions(+), 194 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java b/src/main/java/org/apache/commons/lang3/StringUtils.java index 45ff9ceb6..6677101d8 100644 --- a/src/main/java/org/apache/commons/lang3/StringUtils.java +++ b/src/main/java/org/apache/commons/lang3/StringUtils.java @@ -27,8 +27,10 @@ import java.util.Locale; import java.util.Objects; import java.util.Set; +import java.util.StringJoiner; import java.util.function.Supplier; import java.util.regex.Pattern; +import java.util.stream.IntStream; import org.apache.commons.lang3.function.ToBooleanBiFunction; @@ -1147,6 +1149,35 @@ public static boolean containsAny(final CharSequence cs, final CharSequence... s return containsAny(StringUtils::contains, cs, searchCharSequences); } + /** + *

+ * Checks if the CharSequence contains any of the CharSequences in the given array. + *

+ * + *

+ * A {@code null} {@code cs} CharSequence will return {@code false}. A {@code null} or zero length search array will + * return {@code false}. + *

+ * + * @param cs The CharSequence to check, may be null + * @param searchCharSequences The array of CharSequences to search for, may be null. Individual CharSequences may be + * null as well. + * @return {@code true} if any of the search CharSequences are found, {@code false} otherwise + * @since 3.12 + */ + private static boolean containsAny(final ToBooleanBiFunction test, + final CharSequence cs, final CharSequence... searchCharSequences) { + if (isEmpty(cs) || ArrayUtils.isEmpty(searchCharSequences)) { + return false; + } + for (final CharSequence searchCharSequence : searchCharSequences) { + if (test.applyAsBoolean(cs, searchCharSequence)) { + return true; + } + } + return false; + } + /** *

* Checks if the CharSequence contains any of the CharSequences in the given array, ignoring case. @@ -1180,35 +1211,6 @@ public static boolean containsAnyIgnoreCase(final CharSequence cs, final CharSeq return containsAny(StringUtils::containsIgnoreCase, cs, searchCharSequences); } - /** - *

- * Checks if the CharSequence contains any of the CharSequences in the given array. - *

- * - *

- * A {@code null} {@code cs} CharSequence will return {@code false}. A {@code null} or zero length search array will - * return {@code false}. - *

- * - * @param cs The CharSequence to check, may be null - * @param searchCharSequences The array of CharSequences to search for, may be null. Individual CharSequences may be - * null as well. - * @return {@code true} if any of the search CharSequences are found, {@code false} otherwise - * @since 3.12 - */ - private static boolean containsAny(final ToBooleanBiFunction test, - final CharSequence cs, final CharSequence... searchCharSequences) { - if (isEmpty(cs) || ArrayUtils.isEmpty(searchCharSequences)) { - return false; - } - for (final CharSequence searchCharSequence : searchCharSequences) { - if (test.applyAsBoolean(cs, searchCharSequence)) { - return true; - } - } - return false; - } - /** *

Checks if CharSequence contains a search CharSequence irrespective of case, * handling {@code null}. Case-insensitivity is defined as by @@ -3877,16 +3879,16 @@ public static boolean isWhitespace(final CharSequence cs) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @return the joined String, {@code null} if null array input * @since 3.12 */ - public static String join(final boolean[] array, final char separator) { + public static String join(final boolean[] array, final char delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -3908,7 +3910,7 @@ public static String join(final boolean[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -3919,21 +3921,18 @@ public static String join(final boolean[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.12 */ - public static String join(final boolean[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final boolean[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -3956,16 +3955,16 @@ public static String join(final boolean[] array, final char separator, final int * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final byte[] array, final char separator) { + public static String join(final byte[] array, final char delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -3988,7 +3987,7 @@ public static String join(final byte[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -3999,21 +3998,18 @@ public static String join(final byte[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final byte[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final byte[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -4036,16 +4032,16 @@ public static String join(final byte[] array, final char separator, final int st * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final char[] array, final char separator) { + public static String join(final char[] array, final char delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -4068,7 +4064,7 @@ public static String join(final char[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -4079,21 +4075,18 @@ public static String join(final char[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final char[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final char[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -4116,16 +4109,16 @@ public static String join(final char[] array, final char separator, final int st * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final double[] array, final char separator) { + public static String join(final double[] array, final char delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -4148,7 +4141,7 @@ public static String join(final double[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -4159,21 +4152,18 @@ public static String join(final double[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final double[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final double[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -4196,16 +4186,16 @@ public static String join(final double[] array, final char separator, final int * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final float[] array, final char separator) { + public static String join(final float[] array, final char delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -4228,7 +4218,7 @@ public static String join(final float[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -4239,21 +4229,18 @@ public static String join(final float[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final float[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final float[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -4308,7 +4295,7 @@ public static String join(final int[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -4319,21 +4306,18 @@ public static String join(final int[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final int[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final int[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -4403,7 +4387,7 @@ public static String join(final Iterator iterator, final char separator) { } final Object first = iterator.next(); if (!iterator.hasNext()) { - return Objects.toString(first, EMPTY); + return toStringOrEmpty(first); } // two or more elements @@ -4597,7 +4581,7 @@ public static String join(final long[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -4608,21 +4592,18 @@ public static String join(final long[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final long[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final long[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -4643,15 +4624,15 @@ public static String join(final long[] array, final char separator, final int st * * * @param array the array of values to join together, may be null - * @param separator the separator character to use + * @param delimiter the separator character to use * @return the joined String, {@code null} if null array input * @since 2.0 */ - public static String join(final Object[] array, final char separator) { + public static String join(final Object[] array, final char delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -4672,7 +4653,7 @@ public static String join(final Object[] array, final char separator) { * * * @param array the array of values to join together, may be null - * @param separator the separator character to use + * @param delimiter the separator character to use * @param startIndex the first index to start joining from. It is * an error to pass in a start index past the end of the array * @param endIndex the index to stop joining from (exclusive). It is @@ -4680,25 +4661,18 @@ public static String join(final Object[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 2.0 */ - public static String join(final Object[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final Object[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - if (array[startIndex] != null) { - buf.append(array[startIndex]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(toStringOrEmpty(array[i])); } - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - if (array[i] != null) { - buf.append(array[i]); - } - } - return buf.toString(); + return joiner.toString(); } /** @@ -4721,14 +4695,14 @@ public static String join(final Object[] array, final char separator, final int * * * @param array the array of values to join together, may be null - * @param separator the separator character to use, null treated as "" + * @param delimiter the separator character to use, null treated as "" * @return the joined String, {@code null} if null array input */ - public static String join(final Object[] array, final String separator) { + public static String join(final Object[] array, final String delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -4754,7 +4728,7 @@ public static String join(final Object[] array, final String separator) { * * * @param array the array of values to join together, may be null - * @param separator the separator character to use, null treated as "" + * @param delimiter the separator character to use, null treated as "" * @param startIndex the first index to start joining from. * @param endIndex the index to stop joining from (exclusive). * @return the joined String, {@code null} if null array input; or the empty string @@ -4766,35 +4740,18 @@ public static String join(final Object[] array, final String separator) { * {@code endIndex < 0} or
* {@code endIndex > array.length()} */ - public static String join(final Object[] array, String separator, final int startIndex, final int endIndex) { + public static String join(final Object[] array, String delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - if (separator == null) { - separator = EMPTY; - } - - // endIndex - startIndex > 0: Len = NofStrings *(len(firstString) + len(separator)) - // (Assuming that all Strings are roughly equally long) - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - - final StringBuilder buf = newStringBuilder(noOfItems); - - if (array[startIndex] != null) { - buf.append(array[startIndex]); + final StringJoiner joiner = new StringJoiner(toStringOrEmpty(delimiter)); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(toStringOrEmpty(array[i])); } - - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - - if (array[i] != null) { - buf.append(array[i]); - } - } - return buf.toString(); + return joiner.toString(); } /** @@ -4817,16 +4774,16 @@ public static String join(final Object[] array, String separator, final int star * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final short[] array, final char separator) { + public static String join(final short[] array, final char delimiter) { if (array == null) { return null; } - return join(array, separator, 0, array.length); + return join(array, delimiter, 0, array.length); } /** @@ -4849,7 +4806,7 @@ public static String join(final short[] array, final char separator) { * * @param array * the array of values to join together, may be null - * @param separator + * @param delimiter * the separator character to use * @param startIndex * the first index to start joining from. It is an error to pass in a start index past the end of the @@ -4860,21 +4817,18 @@ public static String join(final short[] array, final char separator) { * @return the joined String, {@code null} if null array input * @since 3.2 */ - public static String join(final short[] array, final char separator, final int startIndex, final int endIndex) { + public static String join(final short[] array, final char delimiter, final int startIndex, final int endIndex) { if (array == null) { return null; } - final int noOfItems = endIndex - startIndex; - if (noOfItems <= 0) { + if (endIndex - startIndex <= 0) { return EMPTY; } - final StringBuilder buf = newStringBuilder(noOfItems); - buf.append(array[startIndex]); - for (int i = startIndex + 1; i < endIndex; i++) { - buf.append(separator); - buf.append(array[i]); + final StringJoiner joiner = newStringJoiner(delimiter); + for (int i = startIndex; i < endIndex; i++) { + joiner.add(String.valueOf(array[i])); } - return buf.toString(); + return joiner.toString(); } /** @@ -4918,32 +4872,17 @@ public static String join(final T... elements) { * StringUtils.joinWith(null, {"a", "b"}) = "ab" * * - * @param separator the separator character to use, null treated as "" - * @param objects the varargs providing the values to join together. {@code null} elements are treated as "" + * @param delimiter the separator character to use, null treated as "" + * @param array the varargs providing the values to join together. {@code null} elements are treated as "" * @return the joined String. * @throws java.lang.IllegalArgumentException if a null varargs is provided * @since 3.5 */ - public static String joinWith(final String separator, final Object... objects) { - if (objects == null) { + public static String joinWith(final String delimiter, final Object... array) { + if (array == null) { throw new IllegalArgumentException("Object varargs must not be null"); } - - final String sanitizedSeparator = defaultString(separator); - - final StringBuilder result = new StringBuilder(); - - final Iterator iterator = Arrays.asList(objects).iterator(); - while (iterator.hasNext()) { - final String value = Objects.toString(iterator.next(), EMPTY); - result.append(value); - - if (iterator.hasNext()) { - result.append(sanitizedSeparator); - } - } - - return result.toString(); + return join(array, delimiter); } /** @@ -5582,8 +5521,8 @@ public static String mid(final String str, int pos, final int len) { return str.substring(pos, pos + len); } - private static StringBuilder newStringBuilder(final int noOfItems) { - return new StringBuilder(noOfItems * 16); + private static StringJoiner newStringJoiner(final char delimiter) { + return new StringJoiner(String.valueOf(delimiter)); } /** @@ -9109,6 +9048,10 @@ public static String toString(final byte[] bytes, final String charsetName) thro return new String(bytes, Charsets.toCharset(charsetName)); } + private static String toStringOrEmpty(final Object obj) { + return Objects.toString(obj, EMPTY); + } + /** *

Removes control characters (char <= 32) from both * ends of this String, handling {@code null} by returning