繁体   English   中英

为什么java.util.Map.values()允许您从返回的Collection中删除条目

[英]Why does java.util.Map.values() allow you to remove entries from the returned Collection

为什么java.util.Map.values()允许您从返回的Collection中删除条目,因为根据值删除键值对是没有意义的? 执行此操作的代码将不知道要删除的值(以及因此的键)是从哪个键映射的。 特别是当存在重复值时,在该C​​ollection上调用remove将导致删除意外的键。

根据值删除键值对是没有意义的

我认为你没有足够的想象力。 我承认可能没有广泛使用它,但会有一些有用的有效案例。

作为示例用例,假设您有一个名为contactListMap<Person, TelephoneNumber> 现在,您希望按本地搜索联系人列表进行过滤。

为此,您可以制作地图的副本localContacts = new HashMap<>(contactList)并删除所有使用区域代码以外的区域代码开始的TelephoneNumber映射。 这将是您想要遍历values集合并删除一些values的有效时间:

Map<Person, TelephoneNumber> contactList = getContactList();
Map<Person, TelephoneNumber> localContacts = new HashMap<Person, TelephoneNumber>(contactList);

for ( Iterator<TelephoneNumber> valuesIt = localContacts.values().iterator(); valuesIt.hasNext(); ){
    TelephoneNumber number = valuesIt.next();
    if ( !number.getAreaCode().equals(myAreaCode) ) {
        valuesIt.remove();
    }
}

特别是当存在重复值时,在该C​​ollection上调用remove将导致删除意外的键。

如果要删除具有该值的所有映射,该怎么办?

它必须有一个remove方法,因为它是Collection的一部分。 鉴于此,它可以选择允许您删除值或抛出UnsupportedOperationException 由于您可能想要删除值的合理原因,为什么不选择允许此操作?

  • 也许有一个给定的值,你想从Map删除它的每个实例。
  • 也许你想出于某种原因削减每三个键/值对。
  • 也许你有一张从酒店房间号码到入住人数的地图,你想要从地图中删除所有入住人数大于1的地图,以便找到一个可以留在的人的房间。
  • ......如果你仔细考虑一下,还有更多这样的例子......

简而言之:在很多情况下,这可能是有用的,实施它不会伤害任何不使用它的人,为什么不呢?

返回的Collection是一个特殊的Collection ,它的语义使得它知道它中的值如何与它来自的Map有关。 javadoc指示返回的集合支持的Collection操作。

我认为基于密钥删除值通常是有用的; 其他答案显示例子。 鉴于此,如果您想删除某个值,为什么您只想删除它的一个特定键? 即使你这样做了,你也必须知道要删除哪个密钥(或者不是,视情况而定),然后你应该通过密钥将其删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM