在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
复制相似问题