我建议研究一下 Guava 的 MultiMap,它可以让您的用例更易于处理(提供大量优化和您以后可能想要获得的额外功能)
编辑:
为什么 Multimap 比使用 computeIfAbsent 方法更有意义的一个例子:
1.每个键都有一个一定大小的列表,如果你以后想得到“总”大小怎么办?您必须创建一些逻辑才能以良好的性能实现这一点(或使用采用 O(keys) 的方法)
2. 目前你只是在地图上放东西,但是如果你以后想从地图上移除东西怎么办?您将需要编写一些样板代码(很容易出错)以确保删除值不会导致内存泄漏
使用多图还有其他好处,但这只是两个容易解释的好处。
编辑 2:
使用您的输入的示例:
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
public class Example {
public static class EntityCompositeId {
@Override
public String toString() {
return "EntityCompositeId [firstId=" + firstId + ", secondId=" + secondId + "]";
}
public EntityCompositeId(Long firstId, Long secondId) {
super();
this.firstId = firstId;
this.secondId = secondId;
}
private Long firstId;
public Long getFirstId() {
return firstId;
}
private Long secondId;
}
public static class EntityComposite {
@Override
public String toString() {
return "EntityComposite [id=" + id + ", first=" + first + ", second=" + second + "]";
}
public EntityComposite(EntityCompositeId id, String first, String second) {
super();
this.id = id;
this.first = first;
this.second = second;
}
private EntityCompositeId id;
public EntityCompositeId getId() {
return id;
}
private String first;
private String second;
}
public static void main(String[] args) {
List<EntityComposite> listEntityComposite = Arrays.asList(
new EntityComposite(new EntityCompositeId(1l, 1l), "firstA", "secondBirdOne"),
new EntityComposite(new EntityCompositeId(1l, 2l), "firstA", "secondBirdTwo"),
new EntityComposite(new EntityCompositeId(1l, 3l), "firstA", "secondBirdThree"),
new EntityComposite(new EntityCompositeId(2l, 1l), "firstB", "secondCatOne"),
new EntityComposite(new EntityCompositeId(2l, 2l), "firstB", "secondCatTwo"),
new EntityComposite(new EntityCompositeId(2l, 3l), "firstB", "secondCatThree"),
new EntityComposite(new EntityCompositeId(3l, 1l), "firstC", "secondDogOne"),
new EntityComposite(new EntityCompositeId(3l, 2l), "firstC", "secondDogTwo"),
new EntityComposite(new EntityCompositeId(3l, 3l), "firstC", "secondDogThree"));
ListMultimap<Long, EntityComposite> map = ArrayListMultimap.create();
listEntityComposite.forEach(entityComposite -> map.put(entityComposite.getId().getFirstId(), entityComposite));
map.keySet().forEach(key -> System.out.println(map.get(key)));
}
}
产生以下输出:
[EntityComposite [id=EntityCompositeId [firstId=1, secondId=1], first=firstA, second=secondBirdOne], EntityComposite [id=EntityCompositeId [firstId=1, secondId=2], first=firstA, second=secondBirdTwo], EntityComposite [id=EntityCompositeId [firstId=1, secondId=3], first=firstA, second=secondBirdThree]]
[EntityComposite [id=EntityCompositeId [firstId=2, secondId=1], first=firstB, second=secondCatOne], EntityComposite [id=EntityCompositeId [firstId=2, secondId=2], first=firstB, second=secondCatTwo], EntityComposite [id=EntityCompositeId [firstId=2, secondId=3], first=firstB, second=secondCatThree]]
[EntityComposite [id=EntityCompositeId [firstId=3, secondId=1], first=firstC, second=secondDogOne], EntityComposite [id=EntityCompositeId [firstId=3, secondId=2], first=firstC, second=secondDogTwo], EntityComposite [id=EntityCompositeId [firstId=3, secondId=3], first=firstC, second=secondDogThree]]