我有一组对象需要通过明确的对象字段来索引。 HashMap有一个示例实现( UPDATE: 实际上,HashMap仅用于说明,我不坚持我寻找的容器肯定是HashMap)
public class Foo {
public String id; // The Field to index by
// some other fields just for number
public int i;
public double d;
public String description;
public String rule;
public double otherD;
public Foo(String id, int i, double d, String description, String rule, double otherD) {
this.id = id;
this.i = i;
this.d = d;
this.description = description;
this.rule = rule;
this.otherD = otherD;
}
}
我需要一个由唯一字符串字段Foo
索引的id
个容器的容器。因此,以下fooHashMap
是当前的解决方案:
HashMap<String, Foo> fooHashMap = null;
fooHashMap.put("bar", Foo("bar", 1, 0.3, "aa", "bb", 0.8));
fooHashMap.put("tzar", Foo("tzar", 8, 12.3, "dlj", "no rule", 0.343));
// etc.
在id
构造函数和hashmap键中加倍Foo
看起来非常难看。 java 8可以提出更优雅的解决方案吗?
我不是指像
public void addFoo(Foo foo) { fooHashMap.put(foo.id, foo); }
答案 0 :(得分:2)
我个人会使用你在最后发布的解决方案:
addFoo(new Foo("bar", 1, 0.3, "aa", "bb", 0.8));
addFoo(new Foo("tzar", 8, 12.3, "dlj", "no rule", 0.343));
让addFoo
方法处理剩下的事情:
public void addFoo(Foo foo) {
fooHashMap.put(foo.id, foo);
}
因为你显然必须创建Foo
个对象,所以我无法想到更优雅的解决方案。
如果您已有foo
个对象列表,则可以像这样创建地图
Map<String, Foo> fooMap = foos
.stream()
.collect(Collectors.toMap(f -> f.id, f -> f));
答案 1 :(得分:2)
以下使用java-8可能会对您有所帮助:
为唯一键getId()
实施getter(id
)。
遍历名为Foo
的{{1}}列表,并将其作为地图收集,如下所示:
fooList
答案 2 :(得分:2)
没有这样的事情;但是根据你可能需要的东西,创建这样的方法 - 让我们说groupBy某些字段根本不会很难。
删除和编辑将再次难以实现,通过一些TreeMap可以说...但是没有开箱即用的东西。我发现的唯一的事情是this multi index container