【问题标题】:ArrayList Stream and Removing ObjectsArrayList 流和删除对象
【发布时间】:2026-02-17 17:40:01
【问题描述】:

您好,我最近开始学习流。我在理解如何使用流从 ArrayList 中删除特定项目时遇到了一些麻烦。

我知道我可以使用这样的行删除特定项目

nameList.removeIf(e ->(e.getName().equals(c.getName))));

我遇到的问题是使用这样的代码来删除项目

nameList.stream()
    .filter( e -> (e.getName().equals(c.getName())))
    .map(nameList::remove);

我不完全确定我错过了什么或这段代码做错了什么。任何帮助,将不胜感激。谢谢你。

【问题讨论】:

    标签: arraylist java-stream


    【解决方案1】:

    你可以这样做,

    List<Element> removedList = nameList.stream().filter(e -> !e.getName().equals(c.getName()))
                    .collect(Collectors.toList());
    

    这就是诀窍。您可以将与Predicate 不匹配的元素收集到不同的列表中,而不是从现有的List 中删除与给定Predicate 匹配的元素。这种方法符合函数式编程的基本概念,例如不变性。

    【讨论】:

      【解决方案2】:

      过滤器函数将返回调用流中与给定谓词函数匹配的项目列表。因此,如果您想要 nameList 中名称等于字符串“x”的项目列表,您可以执行以下操作:

      filteredList = nameList.stream().filter(e -> e.getName().equals(“x”));
      

      您的示例中没有包含变量 c 是什么,所以我不确定如何在示例中使用它。过滤器顶部的 map 函数不需要简单地从列表中过滤元素。

      【讨论】:

      • c 只是一个对象,类似于 e 中存储的对象。我想要做的是过滤掉与 c 相同的对象(例如相同的名称,因此使用 .getName() ),然后将它们从 ArrayList 中删除。我想知道是否可以这样做,过滤并调用 ArrayList 函数“删除”以在过滤后取出任何对象。