我有HashSet<T>
个对象要插入Map<String,T>
,其中String键是T的属性。最有效的方法是什么?我猜有一种比我目前更好的方式:
Map<String,T> myMap = new HashMap<String,T>();
HashSet<T> mySet = new LinkedHashSet<T>();
... Add some T's to mySet
for(T t : mySet){
myMap.put(t.getObjectKey(), t);
}
答案 0 :(得分:5)
您可以使用lambda expressions在Java 8中实现此目的:
Map<String, T> myMap = mySet.stream()
.collect(Collectors.toMap(x -> x.getObjectKey(),x -> x));
其中T是对象的类型,并假设x.getObjectKey()
返回String
。
演示here。
答案 1 :(得分:1)
Guava库允许您使用更多功能风格的方式来粗略地表达您正在做的事情,但它不会更高效,并且使用Java编程语言的当前状态它不会特别非常漂亮。
直到我们在Java 8中获得lambda表达式,你几乎完全不知道你做了什么。
答案 2 :(得分:0)
回答有点迟,我会回答:如果我需要这样的选项,我会根据OOP传统为自己设计一个自定义HashMap
:允许任何类型的{{1}类型Collection
和Set
。
要在List
中映射为(键,值)对条目的Object类应该具有返回类型为HashMap<K, V>
的函数getRelationalKey()
。因此,我们需要将对象类标记为强制实现的类型Relational。我们将使用界面的帮助:
K
interface Relational<T>
{
public T getRelationalKey();
}
应该有一个函数HashMap<K, V>
,可以将集合的所有此类对象放入putAllFromRCollection(Collection)
。因此,带签名的函数声明应该类似于:Map
。因此,自定义putAllFromRCollection(Collection<? extends Relational<K>> collection
:HashMap
可以具有以下实现:
MyHashMap
现在是测试用例的时候了:让我们宣布一个类:
class MyHashMap<K, V> extends HashMap<K, V>
{
public void putAllFromRCollection(Collection<? extends Relational<K>> collection)
{
for(Relational<K> relObj: collection)
{
put(relObj.getRelationalKey(), (V)relObj);
}
}
}
并将此类的一些对象添加到class ATestClass implements Relational<String>
{
public String name;
public String address;
public ATestClass(String name, String address) {
this.name = name;
this.address = address;
}
@Override
public String getRelationalKey() {
return name;// or address or whatever should be regarded as a key
}
}
:
HashSet
<强>输出:强>
HashSet<ATestClass>testSet = new HashSet<>();
testSet.add(new ATestClass("AName", "A-Adress"));
testSet.add(new ATestClass("BName", "B-Adress"));
testSet.add(new ATestClass("CName", "C-Adress"));
testSet.add(new ATestClass("DName", "D-Adress"));
MyHashMap<String, ATestClass>myMap = new MyHashMap<>();
myMap.putAllFromRCollection(testSet);
System.out.println(myMap);
优点是:
{
CName=CollectionsTest.ATestClass@c21495,
BName=CollectionsTest.ATestClass@14b7453,
DName=CollectionsTest.ATestClass@1d5550d,
AName=CollectionsTest.ATestClass@1186fab
}
'S键的Key
匹配类型HashMap
,而不仅仅是Collection<E>
但是,在此实现中,我避免使用提供的HashSet
大小来提供用于调整地图大小的代码,以实现性能。有关详细信息,请参阅Collection
函数的来源。