想要在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);