想要在java中从char数组创建一个字符流

时间:2015-07-22 04:44:24

标签: java java-8 java-stream

从char数组中,我想构建一个使用java 8功能的流,例如过滤器和地图。

char[] list = {'a','c','e'};
Stream<Character> cStream = Stream.of(list);
// Stream<Character> cStream = Arrays.stream(list);

第一种方法不起作用(原因:将cStream更改为Stream<char[]>)。 注释行也不起作用(原因:类型数组中的方法stream(T[])不适用于参数(char[]))。

我知道如果char[] list更改为int[],那么使用IntStream一切正常。但我不想每次都将char[]转换为int[],或者在我需要在char数组上使用流库时更改为列表。

6 个答案:

答案 0 :(得分:26)

您可以使用IntStream生成索引,后跟mapToObj

char[] arr = {'a','c','e'};
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]);

答案 1 :(得分:17)

执行此操作的方法是通过String对象:

char[] list = {'a','c','e'};
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i);

我喜欢这样做,因为转换数组的所有复杂性都包含在String创建中,并且char的包装也在场景后面执行,因此我可以专注于业务逻辑。

答案 2 :(得分:15)

IntStream数组创建char[]的简短有效方法是使用java.nio.CharBuffer

char[] list = {'a','c','e'};
IntStream stream = CharBuffer.wrap(list).chars();

这样,您可以使用IntStream将int值解释为字符。如果你想要一个盒装Stream<Character>(可能效率较低),请使用

Stream<Character> stream = CharBuffer.wrap(list).chars().mapToObj(ch -> (char)ch);

使用CharBuffer可能比IntStream.range快一点,因为它内部有自定义spliterator,因此它不必执行额外的lambda(可能是缓慢的多态调用)。它也只引用char[]数组一次而不是lambda内部,所以它可以与非最终数组变量或函数返回值一起使用(如CharBuffer.wrap(getCharArrayFromSomewhere()).chars())。

答案 3 :(得分:0)

您可以对代码进行的最简单更改是将char[]更改为Character[]

另一种方法是创建盒装char的新ArrayList:

char[] list = {'a','c','e'};
List<Character> listArray = new ArrayList<>();
for (char c : list)
    listArray.add(c);
Stream<Character> cStream = listArray.stream();

此外,您可以使用Google Guava的Chars课程,将for循环替换为:

List<Character> listArray = Chars.asList(list);

答案 4 :(得分:0)

获取字符子流

 String givenString = "MyNameIsArpan";

       Object[] ints = givenString.chars().mapToObj(i -> (char)i).toArray();

       String subString = Arrays.stream(ints,2,6).
                             map(i -> (char)i).
                             map(String::valueOf).
                             collect(Collectors.joining());

      System.out.println(subString);

输出:名称

答案 5 :(得分:0)

使用流生成器:

String inputString = "This is string";
Stream.Builder<Character> charStreamBuilder = Stream.builder();
for (char i :inputString.toCharArray()) {
   charStreamBuilder.accept(i);
 }
 Stream<Character> characterStream = charStreamBuilder.build();