如何用Java Stream从字符数组筛选特定元素生成新char数组并解决类型错误
解决char数组中统计'^'数量的Stream实现问题
先纠正你代码里的核心错误
- 第一段代码的filter条件错误:
IntStream.range(0, arr.length)生成的是数组的索引值,不是字符本身,所以filter(n -> n == '^')逻辑完全错误,应该判断arr[n] == '^'。 - toArray()的类型不匹配:默认的
toArray()返回Object[],而你需要的是char[],这就是报错Required type: char[] Provided: Object[]的根源。解决这个问题有两种思路:要么用CharStream直接生成char[],要么用带生成器的toArray方法处理包装类型数组后再转成基本类型数组。
满足你需求的几种Stream实现方式
方式1:生成仅含'^'的char数组,再取长度(完全符合你的计划)
利用IntStream遍历索引,过滤出目标字符后转成CharStream,直接生成char[]:
char[] arr = {'.', '.', '^', '-', '^'}; char[] tentsInRow = IntStream.range(0, arr.length) .filter(idx -> arr[idx] == '^') .mapToChar(idx -> arr[idx]) .toArray(); int count = tentsInRow.length; // 结果为2
方式2:基于String.chars()的实现
把char数组转成String后,用chars()获取字符的ASCII码流,过滤后转成CharStream生成数组:
char[] arr = getRow(i); char[] tentsInRow = new String(arr) .chars() .filter(c -> c == '^') // chars()返回int类型的字符码,直接和'^'的ASCII码比较即可 .mapToChar(c -> c) .toArray(); int count = tentsInRow.length;
方式3:更高效的直接统计(无需生成数组)
如果只是为了统计数量,没必要生成新数组,直接用count()方法即可:
// 基于索引流的实现 long count = IntStream.range(0, arr.length) .filter(idx -> arr[idx] == '^') .count(); // 基于String流的实现 long count = new String(arr).chars().filter(c -> c == '^').count();
关于toArray(IntFunction<A[]> generator)的用法说明
这个方法需要你传入一个函数,该函数接收数组的长度,返回对应类型的数组。比如如果你用mapToObj得到Stream<Character>(包装类型流),可以这样生成Character[],再转成char[]:
Character[] charObjArr = IntStream.range(0, arr.length) .filter(idx -> arr[idx] == '^') .mapToObj(idx -> arr[idx]) .toArray(Character[]::new); // 这里的Character[]::new就是生成器,接收长度返回Character数组 // 再将Character[]转成char[] char[] charArr = Arrays.stream(charObjArr).mapToChar(Character::charValue).toArray();
不过这种方式多了一步包装类型转基本类型的操作,不如直接用mapToChar生成CharStream高效。
内容的提问来源于stack exchange,提问作者awc
相关产品推荐
相关产品推荐

