由确定字段索引的容器对象

时间:2017-08-20 18:19:57

标签: java java-8 containers

我有一组对象需要通过明确的对象字段来索引。 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); }

3 个答案:

答案 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可能会对您有所帮助:

  1. 为唯一键getId()实施getter(id)。

  2. 遍历名为Foo的{​​{1}}列表,并将其作为地图收集,如下所示:

    fooList

答案 2 :(得分:2)

没有这样的事情;但是根据你可能需要的东西,创建这样的方法 - 让我们说groupBy某些字段根本不会很难。

删除和编辑将再次难以实现,通过一些TreeMap可以说...但是没有开箱即用的东西。我发现的唯一的事情是this multi index container