我有一个项目集合:
class Item {
String type;
boolean flag;
int size;
...
}
有几种可能的类型(比如“a”、“b”和“c”),因此有几种可能的类型标志值组合(["a"; false], ["a"; true"], ["b"; false]
, ... )。我需要折叠具有相同值组合的项目,所以我有带有此签名的 collapse
方法
Item collapse(Collection<Item> items)
我需要的是将输入项列表分成具有相同type
和flag
值的组
List<Collection<Item>> getGroups(Collection<Item> items) // method I need
所以我可以折叠每个组
List<Item> r = getGroups(items).stream().map(Item::collapse).collect(toList());
所以我可以创建一个 map 的 map 或制作一些复合键,但它需要一些我想避免的样板代码。将来我可以有更多的分组属性,所以解决方案不应该在这两个属性上进行硬编码,而是可以很容易地扩展到新的属性。
如何才能很好地做到这一点?该问题是否有众所周知的解决方案?
最佳答案
您可以使用 Collectors.groupingBy :
public static void main(String[] args) {
List<Item> list = new ArrayList<>();
list.add(new Item(1, true, 1));
list.add(new Item(1, true, 2));
list.add(new Item(1, false, 3));
list.add(new Item(1, false, 4));
list.add(new Item(2, true, 5));
list.add(new Item(2, false, 6));
Collection<List<Item>> result = list.stream()
.collect(Collectors.groupingBy(x -> Arrays.<Object>asList(x.keyA, x.keyB)))
.values();
for (List<Item> items : result) {
System.out.println(items);
}
}
static class Item {
Integer keyA;
Boolean keyB;
Integer value;
public Item(Integer keyA, Boolean keyB, Integer value) {
this.keyA = keyA;
this.keyB = keyB;
this.value = value;
}
@Override
public String toString() {
return "Item{" +
"keyA=" + keyA +
", keyB=" + keyB +
", value=" + value +
'}';
}
}
关于java - 在 Java 中按多个属性对对象进行分组的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335223/