将String转换为java.util.Stream
有时我想对字符串中的每个字符做一些简单的事情。 不幸的是,因为字符串是不可变的,除了循环遍历字符串之外没有好的方法可以做到这一点,这可能非常冗长。 如果你要使用Stream,那么它可以做得更短,只需要一两行。
有没有办法将String
转换为Stream
?
您可以使用CharSequence
提供的chars()
方法,因为String
类实现了此接口,您可以访问它。 chars()
方法返回一个IntStream
,因此如果要将IntStream
转换为Stream
需要将其IntStream
转换为(char)
例如
public class Foo { public static void main(String[] args) { String x = "new"; Stream characters = 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();
另请注意,您可以避免装箱,因此它可能比处理Stream
更有效。
收集此类流的另一种方法是使用单独的StringBuilder
:
StringBuilder sb = new StringBuilder(); String result = string.codePoints().map(Character::toUpperCase) .forEachOrdered(sb::appendCodePoint);
虽然这种方法看起来function较少,但如果您已经拥有StringBuilder
或想要稍后将某些内容连接到同一个字符串,则可能会更有效。
您可以使用返回IntStream
chars
方法,并将IntStream
映射到char
您将拥有Stream
。 mapToObj
在我们的例子Stream
of Character
返回Object
值Stream
,因为我们已经将int
映射到char
并且java Auto将它封装到Character
内部 。
Stream stream = "abc".chars().mapToObj(c -> (char)c);
此外,在guava( com.google.common.collect.Lists
)的帮助下,您可以像这样使用它,它从String
返回Character
不可变列表。
Stream stream = Lists.charactersOf("abc").stream();