簡體   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