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

gst*_*low 16 java collections word-wrap

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

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

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

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

fdr*_*ger 9

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

  2. 如果它存在则会有害.没有合适的API将允许您选择新集合的实现(例如,LinkedListvs . ArrayList)或其他参数(如初始大小).

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

  • 我认为这两点中的任何一点都不够令人信服——当然,我们可以从另一个集合构建一个集合,但这总是不必要的开销;也没有什么有害的 - 我想要一个 List 并且我不需要知道它的实际实现 - 只有它是一个可变的事实,例如,如果我将它传递给 Hibernate 它内部可能需要修改它(这就是我的情况) . 不管怎样,如果有需求,那也不是没有意义。 (2认同)

fgb*_*fgb 7

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

new ArrayList<...>(Arrays.asList(...)))
new HashSet<...>(Arrays.asList(...)))
Run Code Online (Sandbox Code Playgroud)

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

Sets.newHashSet(...)
Lists.newArrayList(...)
Maps.newHashMap(ImmutableMap.of(...))
Run Code Online (Sandbox Code Playgroud)