将字符串转换为java.util.Stream<;性格>;

将字符串转换为java.util.Stream<;性格>;,java,string,java-8,java-stream,Java,String,Java 8,Java Stream,有时我想对字符串中的每个字符做一些简单的事情。不幸的是,因为字符串是不可变的,所以除了在字符串中循环外,没有什么好方法可以做到这一点,因为字符串可能非常冗长。如果你想用一个流来代替,它可以做得更短,只需要一两行 有没有办法将字符串转换成流?您可以使用chars方法返回IntStream,并将其映射到char,您将拥有流mapToObj在Character的Stream示例中返回Object值Stream,因为我们已经将int映射到char并在内部将其自动装箱到Character 您可以使用Cha

有时我想对字符串中的每个字符做一些简单的事情。不幸的是,因为字符串是不可变的,所以除了在字符串中循环外,没有什么好方法可以做到这一点,因为字符串可能非常冗长。如果你想用一个流来代替,它可以做得更短,只需要一两行


有没有办法将
字符串
转换成

您可以使用
chars
方法返回
IntStream
,并将其映射到
char
,您将拥有
mapToObj
Character
Stream
示例中返回
Object
Stream
,因为我们已经将
int
映射到
char
并在内部将其自动装箱到
Character

您可以使用
CharSequence
中提供的
chars()
方法,因为
String
类实现了这个接口,所以您可以访问它。
chars()
方法返回一个
IntStream
,因此如果要将
IntStream
转换为
Stream

例如

公共类Foo{
公共静态void main(字符串[]args){
字符串x=“新建”;
流字符=x.chars().mapToObj(i->(char)i);
characters.forEach(System.out::println);
}
}

使用代码点流通常更安全,即
IntStream

IntStream codePoints = string.codePoints();
通过这种方式,Unicode代理项对将合并到单个代码点中,因此您可以使用任何Unicode符号获得正确的结果。用法示例:

String result = string.codePoints().map(Character::toUpperCase)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
还请注意,您避免装箱,因此它可能比处理
更有效

收集此类流的另一种方法是使用单独的
StringBuilder

StringBuilder sb = new StringBuilder();
String result = string.codePoints().map(Character::toUpperCase)
                      .forEachOrdered(sb::appendCodePoint);

虽然这种方法看起来功能性较差,但如果您已经有了一个
StringBuilder
,或者希望稍后将一些内容连接到同一个字符串,那么它可能会更有效。

加上一个建议codePoints()而不是chars()。请注意,如果字符串包含不适合Java字符的Unicode字符,则此解决方案不起作用。例如,一些神秘的语言和表情符号就是这样。有关处理该问题的解决方案,请参阅。
IntStream codePoints = string.codePoints();
String result = string.codePoints().map(Character::toUpperCase)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
StringBuilder sb = new StringBuilder();
String result = string.codePoints().map(Character::toUpperCase)
                      .forEachOrdered(sb::appendCodePoint);