[英]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
List
➠ Stream
➠ StringBuilder
➠ String
一种解决方案是将您的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();
输入:狗🐶
代码点:[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 ;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.