Java Stream中char转int及reduce方法报错问题求助
问题分析与解决方法
原始代码报错原因及修复
原始代码里Arrays.asList(inputChar)的用法有误:char[]是一个数组对象,Arrays.asList会把它当作单个元素存入List,此时data的实际类型是List<char[]>而非List<Character>。后续stream处理时,你试图把char[]强转成int,自然会报类型转换错误。
修复方案:直接使用String的chars()方法获取字符的ASCII码流,写法更简洁:
int input = 351; String inputString = Integer.toString(input); System.out.println("input:- " + inputString); // 直接用chars()获取IntStream,每个元素是字符的ASCII值 inputString.chars() .map(c -> c - 48) // 转成对应的数字 .forEach(System.out::println);
修改后reduce方法报错原因及修复
修改后的代码里,inputString.chars().map(...)返回的是IntStream,而你用reduce("", (initial, entry) -> entry + initial)时,存在两个核心问题:
IntStream的默认reduce方法只处理int类型的累加,无法直接接收String类型的初始值entry是int类型,直接和String拼接会触发类型不匹配错误
修复方案:先把IntStream中的int元素转为String,再用Collectors.joining完成拼接,或者用适配类型的reduce操作:
方案1:使用Collectors.joining(推荐)
int input = 351; String inputString = Integer.toString(input); // 正序拼接排序后的数字 String val = inputString.chars() .map(c -> c - 48) .sorted() .mapToObj(String::valueOf) // 将int转为String .collect(Collectors.joining()); // 如果需要倒序拼接(对应你代码里entry+initial的逻辑),调整排序规则即可 String reversedVal = inputString.chars() .map(c -> c - 48) .sorted((a, b) -> b - a) // 倒序排序 .mapToObj(String::valueOf) .collect(Collectors.joining());
方案2:使用适配类型的reduce
String val = inputString.chars() .map(c -> c - 48) .sorted() .mapToObj(String::valueOf) .reduce("", String::concat);
内容的提问来源于stack exchange,提问作者Juicy Jay
相关产品推荐
相关产品推荐

