繁体   English   中英

从代码点整数列表生成一个字符串对象?

[英]Generate a String object from a List of code point integers?

如果我有一个List< Integer >其整数值是 Unicode代码点数 如何构造由这些代码点确定的字符的String对象?

例如:

List < Integer > codePoints = List.of( 100, 111, 103, 128054 ) ;

… 要么:

List < Integer > codePoints = "cat".codePoints().boxed().toList();

如何从codePoints获取另一个值为cat String对象?

String 有一个构造函数,它接受一个int代码点数字数组。

int[] ints = codePoints.stream().mapToInt(i -> i).toArray();
String string = new String(ints, 0, ints.length);

转换List -> Stream -> IntStream -> int[] -> String

ListStreamStringBuilderString

一种解决方案是将您的List转换为Stream 然后将该流的元素收集到StringBuilder StringBuilder类提供了一个appendCodePoint方法,专门用于容纳代码点整数。 当可变StringBuilder完成时,转换为不可变String

String output = codePoints.stream().collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append ).toString();

或不同的格式:

String output = 
        codePoints
                .stream()
                .collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append )
                .toString();

这是一些示例代码。

String input = "dog🐶" ;
List < Integer > codePoints = input.codePoints().boxed().collect( Collectors.toList() );  // In Java 16+, replace the last part with simply `.toList()`.
String output = 
        codePoints
                .stream()
                .collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append )
                .toString();

查看此代码在 IdeOne.com 上实时运行

输入:狗🐶

代码点:[100, 111, 103, 128054]

输出:狗🐶

要了解使用StringBuilder方法引用的代码如何工作,请参阅Java 8 Int Stream collect with StringBuilder

为方便起见,我们可以制作此代码的实用方法。 为了安全起见,我们可以添加对.filter的调用以跳过任何无效的代码点编号(负数或超出Character.MAX_CODE_POINT )。

public static final String listOfCodePointsToString( List< Integer > codePoints )
{
    String output = 
            codePoints
                    .stream()
                    .filter( codePoint -> Character.isValidCodePoint​( codePoint ) )
                    .collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append )
                    .toString();
    return output ;
}

在 IdeOne.com 上查看实时运行的代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM