Java中IntStream的.distinct()作用机制及原字符串不变问题咨询
现象原因
核心原因是Java的字符串不可变特性 + Stream操作不会修改原始数据源,具体可以拆分为3点:
- Java 中
String是不可变类,一旦完成初始化,字符串对象内部的字符序列就永远无法被修改,任何针对字符串的转换、处理逻辑,都只会生成新的对象/数据副本,不会改动原有字符串的内容。 - Stream 的所有中间操作(你代码中用到的
distinct()、mapToObj()都属于中间操作)设计上就是无副作用的,只会在流的内部处理链路中对元素做转换、过滤、去重,完全不会修改生成流的原始数据源,也就是你这里的字符串a。 - 你的全量代码中没有对变量
a做任何重新赋值操作,流执行结束后,变量a仍然指向原始的"dcbba"字符串对象,调用System.out.println(a)自然会输出原始的带重复字符的内容。
如果需要拿到去重后的字符串,可以在流的末尾新增收集操作,赋值给新的变量即可,示例如下:
// 收集去重后的字符生成新字符串,原a不变 String distinctStr = a.chars() .distinct() .mapToObj(c -> (char) c) .collect(Collectors.joining());
内容的提问来源于stack exchange,提问作者44ly
相关产品推荐
相关产品推荐

