我有一个对象流,它按一个字段分组,并使用以下代码按相同的字段排序:

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;
}

推荐答案

我只是要编辑Partha Sarathi之前的条目.不需要创建中间集合.只需比较比较器中的两个字段即可.因为它已经是一个流,所以我认为在排序之前没有必要将其设置为collectstream:

  data
  .sorted((e1,e2)->{
      var comp1 = e1.field1.compareTo(e2.field1)
      if(comp1 == 0){
          return e1.field2.compareTo(e2.field2);
      }
      return comp1;
  })
 .toList();

Java相关问答推荐

将linkedHashMap扩展到Java中的POJO类

尽管类型擦除,instanceof与泛型在Java中如何工作?

将数组整体转换为链接表

Java .类参数不通过构造函数传递

为什么我的ArrayList索引的索引总是返回-1?

如何创建同一类的另一个对象,该对象位于变量中?

在springboot 3中,当我调用api endpoint时,会出现404

Spark忽略Iceberg Nessie目录

如何从错误通道回复网关,使其不会挂起

无法使用Java&;TestContainers获取AWS SQS队列的属性

更新AWS凭据

EXCEL中的公式单元格显示#NAME?

Spring动态反序列化JSON可以是列表,也可以只是一个对象

为什么这种递归会有这样的行为?

OAuth:登录后无法查看Google邮箱地址

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

为什么Instant没有从UTC转换为PostgreSQL的时区?

使用Java线程进行并行编程

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)

在对象列表上调用提取后,如何判断没有值为空?