转换Iterable< Character>的最佳方法字符串? [英] Best way to convert Iterable<Character> to String?

查看:116
本文介绍了转换Iterable< Character>的最佳方法字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Iterable< Character> 转换为 String 的最简单/最快方法是什么? Iterable?



例如,如何转换AB的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&lt; Character&gt;的最佳方法字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆