将String转换为java.util.Stream <character>

时间:2015-09-09 05:49:59

标签: java string java-8 java-stream

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

有没有办法将String转换为Stream<Character>

3 个答案:

答案 0 :(得分:8)

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

,则需要将其投放到Stream<Character>

E.g。

public class Foo {

    public static void main(String[] args) {
        String x = "new";

        Stream<Character> characters = x.chars().mapToObj(i -> (char) i);
        characters.forEach(System.out::println);
    }
}

答案 1 :(得分:5)

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

IntStream codePoints = string.codePoints();

这样,Unicode代理项对将合并为单个代码点,因此您可以使用任何Unicode符号获得正确的结果。用法示例:

String result = string.codePoints().map(Character::toUpperCase)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();

另请注意,您可以避免装箱,因此它可能比处理Stream<Character>更有效。

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

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

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

答案 2 :(得分:1)

您可以使用返回chars的{​​{1}}方法,并将其映射到IntStream,您将拥有charStream<Character>mapToObj Object Stream的{​​{1}}中返回Stream Character,因为我们已将int映射到char和java 自动装箱到内部<{1}}

Character

此外,在guava(Stream<Character> stream = "abc".chars().mapToObj(c -> (char)c); )的帮助下,您可以像这样使用它,它从com.google.common.collect.Lists返回Character的不可变列表。

String