San*_*Kim 38 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);
Run Code Online (Sandbox Code Playgroud)
第一种方法不起作用(原因:将cStream更改为Stream<char[]>).注释行也不起作用(原因:stream(T[])类型数组中的方法不适用于arguments(char[])).
我知道如果char[] list更改为int[],一切正常使用IntStream.但我不希望每次转换char[]到int[]每个时间或更改到一个列表中,当我需要在使用流库char阵列.
Ale*_* C. 31
您可以使用a IntStream生成索引,后跟mapToObj:
char[] arr = {'a','c','e'};
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]);
Run Code Online (Sandbox Code Playgroud)
Lar*_*sen 20
一种方法是通过String对象:
char[] list = {'a','c','e'};
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i);
Run Code Online (Sandbox Code Playgroud)
我喜欢这样做,因为转换数组的所有复杂性都包含在String创建中,并且char的包装也在场景后面执行,因此我可以专注于业务逻辑.
Tag*_*eev 16
创建IntStreamfrom char[]数组的一种简短而有效的方法是使用java.nio.CharBuffer:
char[] list = {'a','c','e'};
IntStream stream = CharBuffer.wrap(list).chars();
Run Code Online (Sandbox Code Playgroud)
这样,您可以使用IntStream将int值解释为字符.如果你想要一个盒装Stream<Character>(可能效率较低),请使用
Stream<Character> stream = CharBuffer.wrap(list).chars().mapToObj(ch -> (char)ch);
Run Code Online (Sandbox Code Playgroud)
使用CharBuffer可以比IntStream.range内部自定义spliterator 快一点,因此它不必执行额外的lambda(可能是缓慢的多态调用).它也只引用char[]一次数组而不是lambda内部,所以它可以与非最终数组变量或函数返回值(如CharBuffer.wrap(getCharArrayFromSomewhere()).chars())一起使用.
您可以对代码进行的最简单的更改就是更改char[]为Character[].
另一种方法是创建一个装箱的新 ArrayList char:
char[] list = {'a','c','e'};
List<Character> listArray = new ArrayList<>();
for (char c : list)
listArray.add(c);
Stream<Character> cStream = listArray.stream();
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用 Google Guava 的Chars类,将for循环替换为:
List<Character> listArray = Chars.asList(list);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30183 次 |
| 最近记录: |