我有以下代码
Map<BigDecimal, Map<Optional<BigDecimal>, List<TestDto>>> test = data.getTestDtos().stream()
.collect(
Collectors.groupingBy(TestDto::getValue1,
Collectors.groupingBy(dto -> Optional.ofNullable(dto.getValue2()))));
是否有机会按其键(BigDecimal)排序至少外/第一张地图?
我的目标是通过键(BigDecimal和Optional BigDecimal)对两个地图进行排序,但我不确定如何使用lambda ...
答案 0 :(得分:2)
如果您使用的是mapSupplier
,则可以SortedMap
使用TreeMap
。
SortedMap<BigDecimal, Map<Optional<BigDecimal>, List<TestDto>>> test = data.getTestDtos()
.stream()
.collect(
Collectors.groupingBy(TestDto::getValue1, TreeMap::new,
Collectors.groupingBy(dto -> Optional.ofNullable(dto.getValue2()))));
要对内部Map
进行排序,您必须编写自己的Optional-Comparator
,解决方案应如下所示:
SortedMap<BigDecimal, SortedMap<Optional<BigDecimal>, List<TestDto>>> test = data
.getTestDtos()
.stream()
.collect(
Collectors.groupingBy(TestDto::getValue1, TreeMap::new,
Collectors.groupingBy(dto -> Optional.ofNullable(dto.getValue2()),
() -> new TreeMap<>((o1, o2) -> {
if (o1.isPresent() && o2.isPresent()) {
return o1.get().compareTo(o2.get());
} else if (o1.isPresent()) {
return -1;
} else if (o2.isPresent()) {
return 1;
} else {
return 0;
}
}),
Collectors.toList())
)
);
答案 1 :(得分:0)
您只需要从TreeMap
创建一个HashMap
,它就会被排序
Map<String, String> treeMap = new TreeMap<>(test);
答案 2 :(得分:0)
丑陋的解决方案
Map<BigDecimal, Map<Optional<BigDecimal>, List<String>>> sorted = test.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getKey))
.peek(entry -> entry.setValue(new TreeMap<>(entry.getValue())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));