如何将一个字符串转换为Java 8字符流?

33

我发现了这个关于如何从Java字符串中获取java.util.streams.IntStream的问题,但是我在使用Java 8时未找到此方法。

更正:正如你们指出的那样,我正在使用Java 7。现在有chars()方法。但是问题仍然存在:

我该如何从一个String中获取一个Stream<Character>

3个回答

51

我原本想要指向我早前关于这个话题的回答,但事实证明你已经链接到了那个问题。另一个回答也提供了有用的信息。

如果您想要char值,则可以使用String.chars()返回的IntStream并将int值转换为char而不会丢失信息。其他回答解释了为什么Stream类没有CharStream原始的特化。

如果您真的想要装箱的Character对象,则可以使用mapToObj()IntStream转换为引用类型的流。在mapToObj()内,将int值强制转换为char。由于此处需要返回值为对象,因此char将被自动装箱为Character。这将导致Stream<Character>。例如:

Stream<Character> sch = "abc".chars().mapToObj(i -> (char)i);
sch.forEach(ch -> System.out.printf("%c %s%n", ch, ch.getClass().getName()));

a java.lang.Character
b java.lang.Character
c java.lang.Character

3
请确保您正在使用JDK 8。这种方法在CharSequence接口中,由String实现。
下面的代码片段可以正常工作:
import java.util.stream.IntStream;

public class CharsSample {

    public static void main(String[] args) {
        String s =  "123";
        IntStream chars = s.chars();
    }
}

是的,我已经让gradle使用Java 7了。但是我怎么能从一个字符串中获取Stream<Character>呢? - ElderMael
@ElderMael 你使用的是Java 7还是Java 8?这些方法和类型是Java 8中的新功能。 - Sotirios Delimanolis

2

我使用Pattern方法另外一种方法来处理,具体如下:splitAsStream()

String test = "Lobgasex loga nepe co so x";

List<Character> chars = Pattern.compile("").splitAsStream(test)
    .map(i -> i.charAt(0))
    .collect(Collectors.toList());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接