从一个code point数字的IntStream中创建一个字符串?

13
如果我正在使用Java流,并最终得到了一个IntStream,其中包含Unicode字符的code point数字,那么我该如何呈现CharSequence,例如一个String
String output = "input_goes_here".codePoints(). ??? ;  

我发现几个接口和类的codePoints()方法都生成了一个代码点的IntStream,但我找不到任何接受相同类型的构造函数或工厂方法。 我正在寻找反向操作:
➥ 如何从一个代码点的 IntStream 实例化一个 StringCharSequence 等对象?

2
标记为Java-9,其中codePoints API是在JDK中引入的。 - Naman
1
@Naman codePoints() 是在Java 8中引入的。无论如何,我们什么时候停止标记新版本呢?泛型问题需要用java-5标记吗? - shmosel
澄清一下:随着版本的更新,Unicode代码点支持已经逐渐增加。Java 5中引入了StringBuilder::appendCodePointString::codePointAt,Java 8中引入了CharSequence::codePoints,Java 9中引入了String:codePoints。我同意shmosel的观点,即在某个时候,使用Java版本进行标记是多余的。在这里似乎也是如此。这是一个http://meta.StackOverflow.com的话题。 - Basil Bourque
@shmosel 哦,我按照这里记录的方式使用了String特定的实现,并标记了问题。没注意到CharSequence已经有了它。不确定社区普遍采用什么做法。我遵循的方面是,如果一个问题包含特定于该版本的API,则会编辑带有Java版本标签的问题,以便阅读问题的人不会对使用此类API感到惊讶。现在撤销它有意义吗?我同意,这个问题并不特定于Java-9。 - Naman
3个回答

16
使用IntStream::collectStringBuilder一起使用。
String output = 
    "input_goes_here"
    .codePoints()                            // Generates an `IntStream` of Unicode code points, one `Integer` for each character in the string.
    .collect(                                // Collect the results of processing each code point.
        StringBuilder::new,                  // Supplier<R> supplier
        StringBuilder::appendCodePoint,      // ObjIntConsumer<R> accumulator
        StringBuilder::append                // BiConsumer<R,​R> combiner
    )                                        
    .toString()
;

如果您更喜欢通用的CharSequence接口而不是具体的String,只需在末尾去掉toString()即可。返回的StringBuilder是一个CharSequence
IntStream codePointStream = "input_goes_here".codePoints ();
CharSequence output = codePointStream.collect ( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append );

4
我觉得奇怪,没有什么可以替你处理这件事。 - hat

5
更直接地,可以通过传递给`new String(...)`的数组将字符串转换为`String`。
IntStream intStream = "input_goes_here".codePoints();

int[] arr;
String output = new String( (arr = intStream.toArray()), 0, arr.length );

这是一个没有多余的IntStream intStream赋值的简短解决方案: int[] arr;
String output = new String( (arr = "输入在此".codePoints().toArray()), 0, arr.length );

0
不要忘记Java IO库:使用IntStream::collectStringWriter
String output = 
    "input_goes_here".codePoints() // Generates an IntStream of Unicode code points,
                                   //  one Integer for each character in the string.
    .collect(                      // Collect the results of processing each code point.
        StringWriter::new,         // Supplier<R> supplier
        StringWriter::write,       // ObjIntConsumer<R> accumulator
        (w1, w2) -> w1.write(      // BiConsumer<R,R> combiner
            w2.toString() ) )
    .toString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接