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

从char数组,我想构建一个流来使用java 8function,如filter和地图。

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

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

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

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

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

一种方法是通过String对象:

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

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

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

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

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

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

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

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

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

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

此外,您可以使用Google Guava的Chars类来替换for循环:

 List listArray = Chars.asList(list); 

我相信转换为字符流的最简单方法是

  char[] list = {'a','c','e'}; Stream characters = Stream.ofAll(list);