将字符串转换为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);