我有一个对象流,它按一个字段分组,并使用以下代码按相同的字段排序:
for(var group : data
.collect(Collectors.groupingBy(x -> x.field1)
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.toList()) {
//...
}
我想将其按第二个字段分组(不是创建第一组的组,而是按两个字段的组合的单个值进行分组):
for(var group : data
.collect(Collectors.groupingBy(x ->
new AbstractMap.SimpleEntry(x.field1, x.field2))) //this works...
.entrySet()
.stream()
.sorted(...) //not sure what to put here
.toList()) {
//...
}
主要问题是对数据进行排序.我想先在field1上排序,然后是field2.
我到目前为止所try 的(没有编译,因为x是对象类型):
.sorted(Comparator
.comparing(x -> x.getKey().getKey())
.thenComparing(x -> x.getKey().getValue()))
此外,Map.Entry.comparingByKey()
具有允许链接另一个比较器的重载.
我试过了,但它也不起作用(不编译):
Map.Entry.comparingByKey(Map.Entry.comparingByKey())
EDIT1:
我刚刚发现,在groupingBy()
期间呼叫new AbstractMap.SimpleEntry<>()
将比new AbstractMap.SimpleEntry()
保留更多的后期类型信息.
在此更改之后,将很好地编译以下代码:
Map.Entry.comparingByKey(Map.Entry.comparingByKey())
然而,这并不意味着:
Map.Entry.comparingByKey(Map.Entry.comparingByKey())
.thenComparing(Map.Entry.comparingByKey(Map.Entry.comparingByValue()))
EDIT2:这里有更多关于数据模型的信息:
ArrayList<Foo> data= new ArrayList<>();
class Foo {
public String field1;
public LocalDateTime field2;
}