Сделать строку из IntStream из числа точек кода?
Если я работаю с потоками Java, и в конечном итоге IntStream
номеров точек кода для символов Юникода, как я могу сделать CharSequence
такой как String
?
String output = "input_goes_here".codePoints(). ??? ;
Я нашел codePoints()
метод на нескольких интерфейсах и классах, которые все генерируют IntStream
кодовых точек. Тем не менее я не смог найти ни один конструктор или метод фабрики, который принимает то же самое.
CharSequence::codePoints() → IntStream
String::codePoints() → IntStream
StringBuilder::codePoints() → IntStream
Я ищу обратное:
➥ Как создать экземпляр String
или же CharSequence
или такой из IntStream
кодовых точек?
2 ответа
Использование IntStream::collect
с StringBuilder
,
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 );
или более прямой String
используя массив, переданный new 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 = "input_goes_here".codePoints().toArray()), 0, arr.length );
не забыть библиотеку Java IO:
используйте
IntStream::collect
с
StringWriter
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();