【问题标题】:Java - removeIf exampleJava - removeIf 示例
【发布时间】:2019-04-20 04:10:07
【问题描述】:
HashMap<Integer, ArrayList<Integer>> cityMap = new HashMap<>();
...    
for (ArrayList<Integer> list : cityMap.values()) {
    int size = list.size();
    if (size > 0) {
        list.removeIf(i -> true);
    }
}

我不太明白removeIf 在这种情况下做了什么。尤其是部分(i -&gt; true)。谢谢你的解释。

【问题讨论】:

  • .values() 是一组列表,如果其中任何一个包含项目,则删除整个列表。 i -&gt; true 只是意味着“总是删除”。
  • 在这种情况下,list.clear() 的表达方式非常复杂且效率低下。同样,int size = list.size(); if(size &gt; 0) … 是表示if(!list.isEmpty()) … 的冗长方式。由于ArrayList 总是可变的并且清除一个已经为空的列表没有任何效果,因此测试并不是真正必要的。您可以改用for (ArrayList&lt;Integer&gt; list : cityMap.values()) list.clear();。或者,如果你想引入 lambda 表达式:cityMap.values().forEach(list -&gt; list.clear()); 或方法引用:cityMap.values().forEach(List::clear);。所有这些变体都是一样的。
  • 有道理。谢谢。

标签: java lambda


【解决方案1】:

removeIf() 的 Javadoc 声明:

删除此集合中满足给定谓词的所有元素。

您示例中的谓词始终为true,因为您将列表中的每个整数i 映射到true,表达式为:i -&gt; true

我添加了一个更简单的示例,它通过谓词 i % 2 == 0 删除所有偶数并保留所有奇数:

丑陋的设置:

List<List<Integer>> lists = new ArrayList<List<Integer>>() {{
    add(new ArrayList<>(Arrays.asList(1,2,3,4)));
    add(new ArrayList<>(Arrays.asList(2,4,6,8)));
    add(new ArrayList<>(Arrays.asList(1,3,5,7)));
}};

只保留奇数:

for (List<Integer> list : lists) {
    list.removeIf(i -> i % 2 == 0);
    System.out.println(list);
}

输出:

[1, 3]
[]
[1, 3, 5, 7]

【讨论】:

    【解决方案2】:

    removeIf 将遍历列表中的每个元素并在其上运行指定的谓词(布尔函数)。如果谓词返回true,它将从列表中删除。如果谓词返回false,则不会。

    在您的情况下,每个元素都会导致谓词返回 true,从而清除列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2012-01-19
      • 1970-01-01
      相关资源
      最近更新 更多