如何在Java 8中将字符流转换为字符串

Sai*_*pta 0 java java-8 java-stream

如何在Java 8中转换Stream<Character>成A StringCollectors.joining()期望CharSequence因此它给编译错误。

Dea*_*ool 7

转换CharacterString

Stream<Character> st = Stream.of('C','h','t');
String result = st.map(c->c.toString()).collect(Collectors.joining());
System.out.println(result);  //Cht
Run Code Online (Sandbox Code Playgroud)

或者通过使用方法引用

st.map(Object::toString).collect(Collectors.joining())
Run Code Online (Sandbox Code Playgroud)

并在Collectors.joining内部使用StringBuilder 这里

或者只是通过使用 forEach

StringBuilder builder = new StringBuilder();

    Stream<Character> st = Stream.of('C','h','t');

    st.forEach(ch->builder.append(ch));
Run Code Online (Sandbox Code Playgroud)

  • `Collectors.joining` 在内部使用 `StringBuilder`,但这并没有改变通过 `StringBuilder.append(char)` 附加 `Character` 元素比在执行之前先将它们中的每一个转换为 `String` 更有效的事实`StringBuilder.append(String)`。但由于这些都是长度为 1 的字符串,每个元素的成本并不是灾难性的。 (3认同)

Dov*_*vmo 6

请参阅@jubobs解决方案链接。也就是说,您可以在这种情况下以这种方式进行操作:

Stream<Character> testStream = Stream.of('a', 'b', 'c');

String result = testStream.collect(Collector.of(
    StringBuilder::new,
    StringBuilder::append,
    StringBuilder::append,
    StringBuilder::toString));
Run Code Online (Sandbox Code Playgroud)

这是更高性能然后map/castping命令的每个字符的String第一,然后joining,如StringBuilder#append(char c)将切出的是中间步骤。

  • 不适用于“abc”.chars()`,它是一个 IntStream。在那里,必须使用 .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)`。请参阅/sf/answers/1418819181/ (5认同)