使用java8排序和创建Map的问题

yyhrrdl8  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(169)

我有一个这样的代码

@Data
public class person{
  String firstName;
  String lastName;
  int orderNum;
}

List<person> personList = new ArrayList<person>();

我试图排序对象,并试图根据订单号得到Map。
我写了一个逻辑这些这并没有为我工作

Map<String, String> xza = personList.stream()
  .sorted(Comparator.comparing(refDataDto::getOrderNum))
  .collect(Collectors.toList())
  .stream()
  .collect(Collectors.toMap(refDataDto::getFirstName, refDataDto::getastName));
iqxoj9l9

iqxoj9l91#

您正在根据订单号对列表进行排序,将其收集到列表中,从列表创建流,然后将流收集到未排序的Map中。默认情况下,Map不保留键-值对的插入顺序。
你需要的是一个LinkedHashMap,但由于没有现成的收集器助手,you have to set it up manually(你不需要收集数据到一个列表中):
此外,由于您正在处理包含Person对象的流,因此lambda表达式需要引用Person类,而不是refDataDto

Map<String, String> xza = personList.stream()
    .sorted(Comparator.comparing(Person::getOrderNum))
    .collect(Collectors.toMap(
            Person::getFirstName,
            Person::getLastName,
            (v1, v2) -> {
                throw new IllegalStateException("Key conflict");
            },
            LinkedHashMap::new));
ljo96ir5

ljo96ir52#

Collectors.toMap(key,value),将默认创建一个无序的HashMap。您必须使用LinkedHashMap来按照与插入的元素相同的顺序对其进行排序。
另外,.collect(Collectors.toList()).stream()也没有用。sorted会给你一个排序的流,在它上面,你要把它转换成一个列表,然后再转换回流,所以它是无用的。
因此,尝试使用4个参数而不是2个参数的Collectors.toMap重载方法:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function-java.util.function.BinaryOperator-java.util.function.Supplier-

Map<String, String> xza = personList.stream()
  .sorted(Comparator.comparing(Person::getOrderNum))
  .collect(Collectors.toMap(
    Person::getFirstName,
    Person::getastName,
    (u, v) -> {
      throw new IllegalStateException(String.format("Duplicate key %s", u));
    },
    LinkedHashMap::new));

相关问题