英文:
Issue with sorting and creating map using java8
问题
I have a code like this:
@Data
public class Person {
String firstName;
String lastName;
int orderNum;
}
List<Person> personList = new ArrayList<Person>();
I am trying to sort objects and create a map based on the order number.
I wrote the following logic, but it didn't work for me:
Map<String, String> xza = personList.stream()
.sorted(Comparator.comparing(Person::getOrderNum))
.collect(Collectors.toList())
.stream()
.collect(Collectors.toMap(Person::getFirstName, Person::getLastName));
英文:
i have a code like these
@Data
public class person{
String firstName;
String lastName;
int orderNum;
}
List<person> personList = new ArrayList<person>();
i am trying to sort object and trying get map based on order number.
i wrote a logic these this and didn't work for me
Map<String, String> xza = personList.stream()
.sorted(Comparator.comparing(refDataDto::getOrderNum))
.collect(Collectors.toList())
.stream()
.collect(Collectors.toMap(refDataDto::getFirstName, refDataDto::getastName));
答案1
得分: 3
你正在根据订单号对列表进行排序,将其收集到一个列表中,然后从该列表创建一个流,最后将流收集到一个未排序的映射中。默认情况下,映射不会保留插入键值对的顺序。
你需要的是一个LinkedHashMap,但由于没有现成的集合助手可用,你需要手动设置它(而且不需要在中间将数据收集到列表中):
此外,由于你正在处理包含 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));
英文:
You are sorting a list according to the order number, collecting it into a list, creating a stream from the list and then collecting the stream to an unsorted map. Maps don't, by default, preserve the order in which the key-value pairs are inserted.
What you need is a LinkedHashMap, but since there is not a ready made collector helper for it, you have to set it up manually (and you don't need to collect the data to a list in between):
Also, since you are working on streams containing Person
objects, the lambdas need to refer to the Person
class, not 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));
答案2
得分: 2
Collectors.toMap(key, value)
默认会创建一个 HashMap
,它是无序的。 如果要按照插入顺序排序,你需要使用 LinkedHashMap
。
此外,.collect(Collectors.toList()).stream()
是没有用的。sorted
可以给你一个已排序的流,而且你正在将其转换为列表,然后再转回流,所以它是无用的。
因此,尝试使用具有4个参数的 Collectors.toMap
重载方法,而不是2个参数的: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::getLastName,
(u, v) -> {
throw new IllegalStateException(String.format("Duplicate key %s", u));
},
LinkedHashMap::new));
英文:
Collectors.toMap(key,value)
, will by default create a HashMap
, which is unordered. You have to use a LinkedHashMap
to order it in the same order of elements that were inserted in.
Also, .collect(Collectors.toList()).stream()
is not useful. sorted
would have given you a sorted stream, and on top of it, you are converting it to a list and then back to stream, so it is useless.
So, try Collectors.toMap
overloaded method with 4 parameters instead of 2: 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));
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论