从char数组中,我想构建一个使用java 8功能的流,例如过滤器和地图。
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
数组上使用流库时更改为列表。
答案 0 :(得分:26)
您可以使用IntStream
生成索引,后跟mapToObj
:
char[] arr = {'a','c','e'};
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]);
答案 1 :(得分:17)
执行此操作的方法是通过String对象:
char[] list = {'a','c','e'};
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i);
我喜欢这样做,因为转换数组的所有复杂性都包含在String创建中,并且char的包装也在场景后面执行,因此我可以专注于业务逻辑。
答案 2 :(得分:15)
从IntStream
数组创建char[]
的简短有效方法是使用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
快一点,因为它内部有自定义spliterator,因此它不必执行额外的lambda(可能是缓慢的多态调用)。它也只引用char[]
数组一次而不是lambda内部,所以它可以与非最终数组变量或函数返回值一起使用(如CharBuffer.wrap(getCharArrayFromSomewhere()).chars()
)。
答案 3 :(得分:0)
您可以对代码进行的最简单更改是将char[]
更改为Character[]
。
另一种方法是创建盒装char
的新ArrayList:
char[] list = {'a','c','e'};
List<Character> listArray = new ArrayList<>();
for (char c : list)
listArray.add(c);
Stream<Character> cStream = listArray.stream();
此外,您可以使用Google Guava的Chars
课程,将for
循环替换为:
List<Character> listArray = Chars.asList(list);
答案 4 :(得分:0)
获取字符子流
String givenString = "MyNameIsArpan";
Object[] ints = givenString.chars().mapToObj(i -> (char)i).toArray();
String subString = Arrays.stream(ints,2,6).
map(i -> (char)i).
map(String::valueOf).
collect(Collectors.joining());
System.out.println(subString);
输出:名称
答案 5 :(得分:0)
使用流生成器:
String inputString = "This is string";
Stream.Builder<Character> charStreamBuilder = Stream.builder();
for (char i :inputString.toCharArray()) {
charStreamBuilder.accept(i);
}
Stream<Character> characterStream = charStreamBuilder.build();