什么时候使用Java Collections singletonMap方法?


81

我不明白为什么您需要Java Collections singletonMap?在多线程应用程序中有用吗?


3
@skaffman:那将是我的坏事。起初我以为OP是指Commons类,SingletonMap所以我对其进行了编辑。从那以后,我就
撤消

Answers:


121

基本上,它允许您执行以下操作:

callAPIThatTakesAMap(Collections.singletonMap(key, value));

而不是这样:

Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);

当您只有一个键/值对时,这会更好。这种情况可能不会经常出现,但singleton()singletonList()可能频繁是有用的。


12
我一直在使用Spring的命名参数JDBC模板的DAO中一直使用singletonMap。如果您有一个简单的select语句,例如“从id =:barId的bar中选择foo”,那么您将需要一个带有单个键值对的参数映射barId = 123。那是使用singletonMap()的好地方。
spaaarky12 2012年

1
如果有任何API将地图作为输入,而我正在使用Collections.singleton(key,value),那么我将传递不可变地图,这可能对该API不利,因为该API可能会向该地图添加更多元素,并且在这种情况下,因为它是不可变的,所以无能为力。
AKS

2
@AKS:理论上可以,但是实际上只读访问更为常见,并且从API文档中应该清楚是否将条目添加到作为参数传递的映射中。
Michael Borgwardt

@PlabonDutta:否。您可以通过尝试一下,查看API文档或简单地考虑“单身人士”的含义来知道。
Michael Borgwardt '18

15

如果您需要将映射传递给某个通用代码(作为参数或方法的结果)并且知道在这种特殊情况下很有用,但是在其他情况下可能不需要将映射传递给同一通用,这将非常有用代码-您要传递的地图只有一个键。在这种情况下,SingletonMap比完整的地图实现更有效,并且对于程序员也更加方便,因为您需要说的所有内容都可以在构造函数中说明。


8

此外,由Collections.singletonMap()返回的SingletonMap实现比常规的HashMap具有较小的内存占用。它仅包含两个成员字段:键和值,而HashMap维护Node对象以及其他成员字段的内部数组。因此,如果要在内存中创建很多此类映射,则使用Collections.singletonMap()是一个明智的选择。


4

主要是为了方便和抽象。某些API将aCollection作为参数,最好有一种简单的方法将对象转换为Setor Map

singletonMap()并且singletonList()实际上是singletonSet()在Java 1.3中引入的,因为singletonSet()事实证明它很有用。


2
没有singletonSet()方法,它只是称为singleton()
Michael Borgwardt

2

很多答案告诉您何时,但我想指出何时 not use it

如果您不想使用它put items later on

因为把singletonMap将抛出的实现UnsupportedOperationException


0

这只是另一个示例,但是我写了以下代码:

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}

注意@Override。该界面通常可以拍摄许多事物的地图。这个特定的实例总是返回包含一件事的映射。另请注意,映射的键是枚举。因此,从不应该将地图变大,而应该只包含指定了任何操作的结果。在我的实际示例中,最多有5个动作,此实例仅使用其中之一。

是完整的,EnumSet或者EnumMap通常在这些情况下是合适的,但是与上面的代码相比,它们仍然令人讨厌。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.