问题 是否有模拟Collections.singleton()/ Collections.singletonList()/ Collections.singletonMap()来获取可变集合?


我知道如果我有元素,我想得到 List/Set/Map 使用此元素我可以调用:

Collections.singleton() / Collections.singletonList() / Collections.singletonMap()

在这种情况下,我得到不可变的集合(我不能添加/删除元素集合)。

是否有模拟获得可变集合?


6719
2017-08-11 08:43


起源



答案:


  1. 这样的API退出是没有意义的,因为你总是可以使用带有集合的构造函数(new ArrayList(Collections.singleton(whatever))

  2. 如果它存在则会有害。没有合理的API可以让您选择新集合的实现(例如。 LinkedList 与 ArrayList)或其他参数(如初始大小)。

Singleton集合只是非常精简的适配器,用于将单个对象传递给期望集合的API。让它们变得可变会完全违背这一点。


7
2017-08-11 08:46



我不认为两点中的任何一点都足够令人信服 - 事实上,我们可以从另一个集合构建一个集合,但它始终是一个不必要的开销;也没有什么有害的 - 我想要一个List而我不需要知道它的实际实现 - 只是它是一个可变的事实,例如如果我把它传递给Hibernate,它内部可能需要修改它(这是我的情况)。无论如何,如果有需求而不是那么毫无意义。 - skwisgaar
@skwisgaar嗯,我不认为你的用例足够令人信服。对于通用核心API(如Collections类),会议需求始终不如保持合理设计重要。 - fdreger
它不会令人信服,我不表达我的意见,好像它是唯一的和最终的真理;)。事实上,那里 是 尽管你的论点,实现这一点的API - 番石榴和eclipse集合都提供了相应的方法。我只是不认为这个答案应该被标记为接受,因为它提供了无根据的理论而不是人们正在寻找的真正答案。 - skwisgaar
@skwisgaar问题是关于标准库,我的答案是正确的(没有这样的方法),它包含正确解释为什么它没有意义(以及为什么有一个特殊情况的单身人士)。您确定Guava和/或Eclipse库包含用于构建可变单例列表的特殊方法吗?我认为你不正确 - 他们不是(但没有检查,所以你可以证明我错了;我认为Eclipse集合有单例列表是可变的,但有固定的大小,这显然不是OP所要求的关于) - fdreger
问题没有提到'标准库',对吗?虽然它确实表明作者希望获得一个带有一个元素的可变集合。当然,这种方法不会被称为“单身”,因为它意味着单一元素,但如果我们谈论类似物 - 番石榴和日食完全没问题,例如@fgb回答。因此,我认为完整的答案应该是不,标准库中没有方法,但可以使用这两个方法来初始化具有单个元素的集合。 - skwisgaar


答案:


  1. 这样的API退出是没有意义的,因为你总是可以使用带有集合的构造函数(new ArrayList(Collections.singleton(whatever))

  2. 如果它存在则会有害。没有合理的API可以让您选择新集合的实现(例如。 LinkedList 与 ArrayList)或其他参数(如初始大小)。

Singleton集合只是非常精简的适配器,用于将单个对象传递给期望集合的API。让它们变得可变会完全违背这一点。


7
2017-08-11 08:46



我不认为两点中的任何一点都足够令人信服 - 事实上,我们可以从另一个集合构建一个集合,但它始终是一个不必要的开销;也没有什么有害的 - 我想要一个List而我不需要知道它的实际实现 - 只是它是一个可变的事实,例如如果我把它传递给Hibernate,它内部可能需要修改它(这是我的情况)。无论如何,如果有需求而不是那么毫无意义。 - skwisgaar
@skwisgaar嗯,我不认为你的用例足够令人信服。对于通用核心API(如Collections类),会议需求始终不如保持合理设计重要。 - fdreger
它不会令人信服,我不表达我的意见,好像它是唯一的和最终的真理;)。事实上,那里 是 尽管你的论点,实现这一点的API - 番石榴和eclipse集合都提供了相应的方法。我只是不认为这个答案应该被标记为接受,因为它提供了无根据的理论而不是人们正在寻找的真正答案。 - skwisgaar
@skwisgaar问题是关于标准库,我的答案是正确的(没有这样的方法),它包含正确解释为什么它没有意义(以及为什么有一个特殊情况的单身人士)。您确定Guava和/或Eclipse库包含用于构建可变单例列表的特殊方法吗?我认为你不正确 - 他们不是(但没有检查,所以你可以证明我错了;我认为Eclipse集合有单例列表是可变的,但有固定的大小,这显然不是OP所要求的关于) - fdreger
问题没有提到'标准库',对吗?虽然它确实表明作者希望获得一个带有一个元素的可变集合。当然,这种方法不会被称为“单身”,因为它意味着单一元素,但如果我们谈论类似物 - 番石榴和日食完全没问题,例如@fgb回答。因此,我认为完整的答案应该是不,标准库中没有方法,但可以使用这两个方法来初始化具有单个元素的集合。 - skwisgaar


使用标准库,您可以使用:

new ArrayList<...>(Arrays.asList(...)))
new HashSet<...>(Arrays.asList(...)))

这些可以将任意数量的元素作为参数。像番石榴这样的库有一些方便的方法:

Sets.newHashSet(...)
Lists.newArrayList(...)
Maps.newHashMap(ImmutableMap.of(...))

5
2017-08-11 09:18