2017-07-18 1053 views
0

我想从某个过滤器的列表中删除对象,并且存在多个对象。获取lambda foreach表达式中的索引java 8

list.stream().filter(g->g.getName().equalsIgnoreCase("String")).forEach(result ->{ 

      /* is it possible to get the index of the result here? 
      .remove(), will iterate through the list again. I don't want that. 
      */ 

      list.remove(result); 
}); 
+2

这不是一个真正可行的方法。一个更好的方法是将你不想过滤的元素收集到一个新列表中。 –

+0

是的,有道理。谢谢。但我需要将结果合并到一个对象中,然后删除以前的对象。我怎样才能做到这一点?这是我的最终目标 –

+0

@AnkurSehdev如果您需要合并,然后再从列表中删除,请在您的问题中指定,以便答案可以对您有所帮助。请同时告诉我们这个合并是什么,等等。 –

回答

4

您可以使用Collection#removeIf代替,例如:

list.removeIf(g -> g.getName().equalsIgnoreCase("String")); 
+0

是的,有道理。谢谢。但我需要将结果合并到一个对象中,然后删除以前的对象。我怎样才能做到这一点?这是我的最终目标 –

+0

@AnkurSehdev嗨,我不擅长英语。请问Holger,谢谢。 –

+0

当然,非常感谢你的帮助:) –

7

有没有办法让在这一点上的索引,但修改list你流过,无论如何都不会支持。当您尝试时,您可能会得到ConcurrentModificationException

使用此操作的专用API:

list.removeIf(g -> g.getName().equalsIgnoreCase("String")); 

会收集你想保持到一个新的List元素的替代:

List<String> result = list.stream() 
    .filter(g -> !g.getName().equalsIgnoreCase("String")) 
    .collect(Collectors.toList()); 
+0

谢谢,但我需要将结果合并到一个对象中,然后删除以前的对象。我怎样才能做到这一点?这是我的最终目标 –

+0

@AnkurSehdev嗨,我不擅长英语。你的意思是将删除的项目合并到另一个列表中? –

+0

我在这个列表中有JSON对象。我想将两个对象合并或组合成一个新对象。并从同一个列表中删除原始的。 –

0

很抱歉,如果不能帮助你

list.stream().filter(g->g.getName().equalsIgnoreCase("String")).forEach(result ->{ 
list.indexOf(result); 
}); 
+0

可能是我错了解了这个问题:) –