我试图使用来迭代一个集合,forEach
但是意识到调用remove(Object o)
该集合是不安全的,并且可能会导致ConcurrentModificationException
。这是我正在尝试做的事情:
public void removeMatchup(Set<Player> players) {
predefinedMatchups.stream().filter(m -> m.getPlayers().equals(players)).forEach(m -> predefinedMatchups.remove(m));
}
因此,我将其更改为:
public void removeMatchup(Set<Player> players) {
Iterator<Matchup> iterator = predefinedMatchups.iterator();
while (iterator.hasNext())
if (iterator.next().getPlayers().equals(players))
iterator.remove();
}
我真的很喜欢流的简洁性,这就是为什么我要重新设计整个项目以包含Java 8的新功能。
有没有解决此问题的方法,我可以在执行安全删除时使用流?
既然Set
是Collection
这样,我们就可以使用removeIf(Predicate<? super E> filter)
方法(例如,默认情况下,一个内部使用方法Iterator
及其remove
方法,就像您在第二个示例中一样)。
409 默认 布尔值removeIf(谓词<?super E>过滤器){
410 对象。requireNonNull(过滤器);
411 布尔值已移除=否;
412 最终的 迭代器<E> each = iterator();
413 而(每个。hasNext()){
414 如果(过滤器。试验(每。下一个())){
415 的每个。删除();
416 移除= true;
417 }
418 }
419 返回已删除;
420 }
因此您的代码如下所示:
public void removeMatchup(Set<Player> players) {
predefinedMatchups.removeIf(m -> m.getPlayers().equals(players));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句