Java 8 / Lambda:多个collect / Collectors.groupingBy with sorted

时间:2017-08-04 06:23:03

标签: java java-8

我有以下代码

    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 ...

3 个答案:

答案 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));