【问题标题】:Get index in lambda foreach expression java 8在lambda foreach表达式java 8中获取索引
【发布时间】:2017-07-18 16:29:47
【问题描述】:

我想从某个过滤器的列表中删除对象,并且有多个对象。

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);
});

【问题讨论】:

  • 这不是一个真正可行的方法。更好的方法是将您不想过滤掉的元素收集到一个新列表中。
  • 是的,有道理。谢谢。但我需要将结果合并到一个对象中,然后删除以前的对象。我怎样才能做到这一点?这是我的终极目标
  • @AnkurSehdev 如果您在从列表中删除之前需要合并,请在您的问题中指定,以便答案对您有所帮助。还请告诉我们这次合并的全部内容等。
  • @ Federico Peralta Schaffner 当然,这是我的第一个问题。下次我会尽量提供每一个细节。谢谢

标签: java arraylist lambda foreach java-8


【解决方案1】:

此时无法获取索引,但无论如何也不支持修改您正在流式传输的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());

【讨论】:

  • 谢谢,但我需要将结果合并到一个对象中,然后删除之前的对象。我怎样才能做到这一点?这是我的终极目标
  • @AnkurSehdev 嗨,我不擅长英语。您的意思是将已删除的项目合并到另一个列表中吗?
  • 我在这个列表中有 JSON 对象。我想将两个对象合并或组合成一个新对象。并从同一个列表中删除原始的。
  • @AnkurSehdev 先生,对不起,我不知道。由于我的英语不好,:(
  • 我不确定我的任务是否正确,但请注意,在第二个示例中,result 将包含在操作后与您的谓词匹配的对象。然后,您可以通过list.removeAll(result); 将这些对象从原始列表中删除。
【解决方案2】:

您可以改用Collection#removeIf,例如:

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

【讨论】:

  • 是的,有道理。谢谢。但我需要将结果合并到一个对象中,然后删除以前的对象。我怎样才能做到这一点?这是我的终极目标
  • @AnkurSehdev 嗨,我不擅长英语。请询问霍尔格,谢谢。
  • 好的,非常感谢您的帮助:)
  • @AnkurSehdev 一点也不。
【解决方案3】:

如果不能帮到您,请见谅

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多