【问题标题】:Convert a String to a java.util.Stream<Character>将字符串转换为 java.util.Stream<Character>
【发布时间】:2015-09-09 05:49:59
【问题描述】:

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

有没有办法将String 转换为Stream&lt;Character&gt;

【问题讨论】:

    标签: java string java-8 java-stream


    【解决方案1】:

    您可以使用CharSequence 中提供的chars() 方法,并且由于String 类实现了此接口,您可以访问它。 chars() 方法返回一个 IntStream ,因此如果您想将 IntStream 转换为 Stream&lt;Character&gt; ,则需要将其转换为 (char)

    例如

    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);
        }
    }
    

    【讨论】:

    • 请注意,如果字符串包含不适合 Java 字符的 Unicode 字符,则此解决方案不起作用。例如,一些神秘的语言和表情符号就是这种情况。有关处理该问题的解决方案,请参阅 Tagir's answer
    【解决方案2】:

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

    IntStream codePoints = string.codePoints();
    

    这样,Unicode 代理对将合并为单个代码点,因此任何 Unicode 符号都会得到正确的结果。示例用法:

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

    还要注意避免装箱,因此它可能比处理Stream&lt;Character&gt; 更有效。

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

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

    虽然这种方法看起来不太实用,但如果您已经有 StringBuilder 或想稍后将更多内容连接到同一字符串,它可能会更有效。

    【讨论】:

    • 加一个建议 codePoints() 优先于 chars()。
    【解决方案3】:

    您可以使用返回IntStreamchars 方法并将其映射到char,您将拥有Stream&lt;Character&gt;mapToObj 返回 ObjectStream 在我们的例子中是 StreamCharacter,因为我们已经将 int 映射到 char 和 java Auto Boxed 它到 Character 内部

    Stream<Character> stream = "abc".chars().mapToObj(c -> (char)c);
    

    此外,在 guava (com.google.common.collect.Lists) 的帮助下,您可以像这样使用它,它从 String 返回 Character 的不可变列表。

    Stream<Character> stream = Lists.charactersOf("abc").stream();
    

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 2017-07-26
      • 1970-01-01
      • 2019-10-10
      • 2019-01-05
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多