StringUtils
和ArrayUtils
。int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(ArrayUtils.toObject(arr), " - ");
StringUtils.join(arr, " - ");
,因为StringUtils
没有这个重载版本的方法。不过,它有一个StringUtils.join(int[], char)
的方法。int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = Arrays.stream(arr)
.mapToObj(String::valueOf)
.collect(Collectors.joining(" - "));
String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
String result = String.join(" - ", sarr);
如果你被困在使用Java 7或更早版本且没有库的情况下,你可以编写自己的实用方法:
public static String myJoin(int[] arr, String separator) {
if (null == arr || 0 == arr.length) return "";
StringBuilder sb = new StringBuilder(256);
sb.append(arr[0]);
//if (arr.length == 1) return sb.toString();
for (int i = 1; i < arr.length; i++) sb.append(separator).append(arr[i]);
return sb.toString();
}
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = myJoin(arr, " - ");
Java 8的解决方案如下:
Stream.of(1,2,3,4).map(String::valueOf).collect(Collectors.joining("-"))
在Java 8+中,你可以使用IntStream
和StringJoiner
。像这样:
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
StringJoiner sj = new StringJoiner(" - ");
IntStream.of(arr).forEach(x -> sj.add(String.valueOf(x)));
System.out.println(sj.toString());
输出结果为(按要求)
1 - 2 - 3 - 4 - 5 - 6 - 7
Joiner.on("-")
.join(texts);
更加精确地说,您应该首先使用Arrays.asList()
或Guava的基本类型友好的等价物将数组包装成一个List
。
Joiner.on("-")
.join(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
Joiner.on("-")
.join(Ints.asList(arr));
Arrays.asList(arr)
会生成一个大小为1的 List
=) 这个列表中唯一的元素就是我们的原始数组。 - spiritint[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
IntStream.of(arr).mapToObj(i -> String.valueOf(i)).collect(Collectors.joining(",")) ;
我相信在Kotlin/Scala或其他JVM语言中也有一种方法可以做到这一点,但对于像上面那样的一小组值,你始终可以保持简单:
int i, arrLen = arr.length;
StringBuilder tmp = new StringBuilder();
for (i=0; i<arrLen-1; i++)
tmp.append(arr[i] +" - ");
tmp.append(arr[arrLen-1]);
System.out.println( tmp.toString() );
如果您的分隔符是一个单个字符,您可以使用Common Lang中的StringUtils:
int[] arr = {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(arr, '-');
然而,如果分隔符是一个字符串,你应该使用另一种方法,因为StringUtils表现不佳(请参见此票据)。
我一直在寻找一种方法,在不首先为每个基元类型实例化字符串的情况下加入流中的基元类型。我已经做到了这一点,但仍需要将它们装箱。
LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> {
if (sb.length() != 0)
sb.append(',');
sb.append(v.longValue());
}, (a, b) -> a.length() == 0 ? b : b.length() != 0 ? a.append(',').append(b) : a, StringBuilder::toString));
public static StringBuilder join(CharSequence delimiter, int... arr) {
if (null == delimiter || null == arr) throw new NullPointerException();
StringBuilder sb = new StringBuilder(String.valueOf(arr[0]));
for (int i = 1; i < arr.length; i++) sb.append(delimiter).append(arr[i]);
return sb;
}
public static void main(String[] args) {
StringBuilder sb = join(" - ", 1, 2, 3, 4);
System.out.println(sb.toString());//you could pass sb also coz println automatically call toString method within it
System.out.println(sb.insert(0, "[").append("]"));
}
1 - 2 - 3 - 4
[1 - 2 - 3 - 4]
.collect(Collectors.joining(","))
代替临时的字符串数组。 - shmoselArrays.stream(arr)
生成一个IntStream
,其中没有collect()
方法。 - spirit