如何通过Java 8 Stream填充已实例化的Set<String>?
问题解答
为什么你的代码里dict是空的?
Java Stream是惰性求值的:只有当你调用终端操作(比如collect、forEach、count等)时,中间操作(比如map)才会被实际执行。你原代码里只创建了Stream并调用了map,但没有触发任何终端操作,所以map里的lambda代码根本没执行,dict自然是空的。
能不能在map里修改外部dict完成填充?
技术上可以,但强烈不推荐,而且完全违背Stream和函数式编程的设计思想:
- 如果你非要让
map里的代码执行,得加个终端操作(比如forEach或者collect),但这么做会带来很多问题:- 线程安全问题:如果Stream并行执行(比如用
parallelStream),HashSet不是线程安全的,会出现并发修改异常或者数据丢失。 - 违背无副作用原则:函数式编程要求操作尽量无副作用,
map的职责是转换元素,而不是修改外部状态。这种写法会让代码逻辑混乱,可读性和可维护性极差。
- 线程安全问题:如果Stream并行执行(比如用
正确的做法
就用你注释里的collect方法,这是Stream API设计的标准用法,简洁、安全、符合函数式风格:
dict = Arrays.stream(arr).collect(Collectors.toSet());
如果非要用外部已实例化的集合(完全没必要,除非有特殊场景),可以用forEach而不是map(forEach就是专门用来处理副作用的),但依然不推荐:
Arrays.stream(arr).forEach(item -> dict.add(item));
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

