转换Iterable< Character>的最佳方法字符串? [英] Best way to convert Iterable<Character> to String?
问题描述
将 Iterable< Character>
转换为 String
的最简单/最快方法是什么? Iterable?
例如,如何转换A,B的Iterable和C,字符串ABC?
iter.toString( )
返回一个字符串[A,B,C]。
5个版本:
1)通过 StringBuilder.append()收集Java 8流
:
public static String streamAppend(Iterable< Character> chars){
return StreamSupport.stream(chars.spliterator(),true)
.collect(
StringBuilder :: new,
StringBuilder :: append,
StringBuilder :: append
)
.toString();
}
Java 8流通过收集Collectors.joining()
public static String streamJoin(Iterable< Character> chars){
return StreamSupport。 stream(chars.spliterator(),true)
.map(Object :: toString)
.collect(Collectors.joining());
}
使用Java 5 for循环的Pre-Java8-Version:
public static String java7(Iterable< Character> chars){
StringBuilder sb = new StringBuilder();
for(Character c:chars){
sb.append(c);
}
返回sb.toString();
}
如您所见,最后一个版本( iterableForEach
)实际上是最快的,Java 7和Guava版本至少在类似的范围内。对于数百个元素下的大小,Streams失败了,它们显然针对大型数据集进行了优化。但是在1000个元素中,它们表现得更好,几乎与Java 7版本相当。大约10000个元素(不在此图表上),Streams优于其他解决方案。
基准代码作为GitHub要点提供,随时修改参数并检查机器上的结果。
What's the easiest/fastest way to convert an Iterable<Character>
to a String
of the characters from the Iterable?
For example, how to convert an Iterable of "A", "B", and "C", to a String "ABC"?
The iter.toString()
returns a String "[A, B, C]".
5 Versions:
1) Java 8 streams collecting via StringBuilder.append()
:
public static String streamAppend(Iterable<Character> chars){
return StreamSupport.stream(chars.spliterator(), true)
.collect(
StringBuilder::new,
StringBuilder::append,
StringBuilder::append
)
.toString();
}
Java 8 Streams collecting via Collectors.joining()
public static String streamJoin(Iterable<Character> chars){
return StreamSupport.stream(chars.spliterator(), true)
.map(Object::toString)
.collect(Collectors.joining(""));
}
Pre-Java8-Version using Java 5 for loops:
public static String java7(Iterable<Character> chars) {
StringBuilder sb = new StringBuilder();
for (Character c: chars) {
sb.append(c);
}
return sb.toString();
}
Guava version using a Joiner
:
public static String guavaJoin(Iterable<Character> chars) {
return Joiner.on("").join(chars);
}
Java 8 version using Iterable.forEach()
and method references:
public static String iterableForEach(Iterable<Character> chars){
StringBuilder sb = new StringBuilder();
chars.forEach(sb::append);
return sb.toString();
}
After the discussions regarding performance, I ran a JMH micro-benchmark to see for myself. The results are obvious, but much more drastic than expected.
Benchmark (mode) (size) Score Units
CharsToString.stringJoin STREAM_APPEND 1 5071451.223 ± ops/s
CharsToString.stringJoin STREAM_APPEND 2 481656.870 ± ops/s
CharsToString.stringJoin STREAM_APPEND 5 162359.508 ± ops/s
CharsToString.stringJoin STREAM_APPEND 10 76910.668 ± ops/s
CharsToString.stringJoin STREAM_APPEND 20 49590.249 ± ops/s
CharsToString.stringJoin STREAM_APPEND 50 44608.948 ± ops/s
CharsToString.stringJoin STREAM_APPEND 100 20940.993 ± ops/s
CharsToString.stringJoin STREAM_APPEND 200 29634.118 ± ops/s
CharsToString.stringJoin STREAM_APPEND 500 19387.956 ± ops/s
CharsToString.stringJoin STREAM_APPEND 1000 17629.508 ± ops/s
CharsToString.stringJoin STREAM_JOIN 1 3342341.147 ± ops/s
CharsToString.stringJoin STREAM_JOIN 2 279516.584 ± ops/s
CharsToString.stringJoin STREAM_JOIN 5 102312.667 ± ops/s
CharsToString.stringJoin STREAM_JOIN 10 61759.122 ± ops/s
CharsToString.stringJoin STREAM_JOIN 20 34802.386 ± ops/s
CharsToString.stringJoin STREAM_JOIN 50 37629.593 ± ops/s
CharsToString.stringJoin STREAM_JOIN 100 33493.715 ± ops/s
CharsToString.stringJoin STREAM_JOIN 200 26186.986 ± ops/s
CharsToString.stringJoin STREAM_JOIN 500 19264.628 ± ops/s
CharsToString.stringJoin STREAM_JOIN 1000 14446.396 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 1 6570784.907 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 2 3821031.465 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 5 1574828.190 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 10 806057.685 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 20 356533.358 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 50 156129.534 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 100 100195.171 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 200 54820.347 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 500 20577.137 ± ops/s
CharsToString.stringJoin GUAVA_JOIN 1000 11465.704 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 1 11921819.833 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 2 7007911.144 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 5 4415785.561 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 10 2107685.852 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 20 1158806.591 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 50 482412.510 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 100 265362.511 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 200 123663.470 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 500 49238.673 ± ops/s
CharsToString.stringJoin ITERABLE_FOREACH 1000 24328.723 ± ops/s
CharsToString.stringJoin JAVA7 1 9746936.478 ± ops/s
CharsToString.stringJoin JAVA7 2 6431473.785 ± ops/s
CharsToString.stringJoin JAVA7 5 2736936.112 ± ops/s
CharsToString.stringJoin JAVA7 10 1764353.273 ± ops/s
CharsToString.stringJoin JAVA7 20 833322.493 ± ops/s
CharsToString.stringJoin JAVA7 50 278354.933 ± ops/s
CharsToString.stringJoin JAVA7 100 180763.740 ± ops/s
CharsToString.stringJoin JAVA7 200 86729.675 ± ops/s
CharsToString.stringJoin JAVA7 500 38560.347 ± ops/s
CharsToString.stringJoin JAVA7 1000 17798.159 ± ops/s
As you can see, the last version (iterableForEach
) is actually the fastest one, with the Java 7 and Guava versions at least in a similar ballpark. For Sizes under several hundred elements, Streams fail miserably, they are obviously optimized for large data sets. But at 1000 elements, they perform significantly better and almost on par with the Java 7 version. At about 10000 elements (not on this chart), Streams outperform the other solutions.
The benchmark code is available as a GitHub gist, feel free to tinker with the parameters and check the results on your machine.
这篇关于转换Iterable< Character>的最佳方法字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!