【发布时间】:2017-09-30 09:30:11
【问题描述】:
我想看看我是否可以按多个键进行分组。 假设我有一门课:
Class Something {
String name;
String id;
}
还有一个清单:
Name id
David 123
David 456
Bryant 123
Ryan 456
Foo 555
Bar 555
我可以将它们分组
[(David, 123), (David, 456), (Bryant, 123), (Ryan, 456)]
[(Foo, 555), (Bar, 555)]
这意味着,我希望类“等于”的行为是名称或 id 相同,类等于,这样
public boolean equals(Object o) {
Something that = (Something) o;
return this.name.equals(that.name) || this.id.equals(that.id);
}
但是那个equals函数的问题是不可传递的,这意味着我不能为它写一个对应的hashCode函数。
我知道如果我写两个哈希图,我可以通过这样做来实现这一点
Map<String, Something> idToSomething;
Map<String, Something> nameToSomething;
现在的问题是,我应该如何通过使用集合来实现我想要的行为,比如这些东西是否在一个名为 somethings 的列表中,所以我可以做类似的事情
somethings.stream().collect(Collectors.groupby(???))
请注意,我也希望能够更改 ???将来通过按策略应用不同的分组很容易,比如说我将来可能只想按名称或 id 分组。
【问题讨论】:
-
你可能想看看 Google Guava 的 Multimap
标签: java java-8 java-stream collectors