在char数组中,我想构造一个使用java8特性的流,比如过滤器和映射。
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
数组上使用流程库时将其转换为列表。
发布于 2015-07-22 16:03:17
您可以使用后跟mapToObj
的IntStream
来生成索引
char[] arr = {'a','c','e'};
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]);
发布于 2016-07-20 19:03:56
实现此目的的一种方法是通过String对象:
char[] list = {'a','c','e'};
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i);
我喜欢这样做,因为转换数组的所有复杂性都被包装到字符串创建中,而且char的包装也是在后台为我执行的,因此我可以专注于业务逻辑。
发布于 2015-07-27 17:17:04
从char[]
阵列创建IntStream
的一种简单而有效的方法是使用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
快一点,因为它内部有自定义拆分器,所以它不必执行额外的lambda (可能是缓慢的多态调用)。此外,它只引用char[]
数组一次,并且不在lambda中,因此它可以与非最终数组变量或函数返回值(如CharBuffer.wrap(getCharArrayFromSomewhere()).chars()
)一起使用。
https://stackoverflow.com/questions/31554025
复制相似问题