Java遍历Stream时移除HashMap中HashSet内指定元素问题
解决HashMap中HashSet元素的移除问题
你的代码之所以没生效,核心原因是Stream的中间操作(比如map)必须配合终端操作才会执行,你只调用了map,整个流根本没触发执行,自然不会有元素被移除。
给你两种可行的修正方案:
方案一:用forEach替代map(推荐)
因为我们不需要把集合映射成新值,只是要对每个Set执行移除操作,直接用forEach更直观高效:
placementByConcept.entrySet() .stream() .forEach(e -> e.getValue() .removeIf(s -> s.getBeatObjectiveId().equals("non-scored")));
forEach是终端操作,会触发流的执行,每个Set都会调用removeIf移除符合条件的PlacementBundle对象。
方案二:保留map但添加终端操作
如果你非要用map(其实没必要),可以加个终端操作比如count来触发流执行:
placementByConcept.entrySet() .stream() .map(e -> e.getValue() .removeIf(s -> s.getBeatObjectiveId().equals("non-scored"))) .count(); // 终端操作,触发流执行
不过这种写法完全没必要,forEach才是符合语义的选择。
补充说明:removeIf方法本身就是直接修改原HashSet的,只要它被执行到,符合条件的元素就会被移除,所以核心问题还是流没有被触发执行。
内容的提问来源于stack exchange,提问作者Sathesh
相关产品推荐
相关产品推荐

