【问题标题】:Ordering a Map using Lambda Expressions in Java8在 Java8 中使用 Lambda 表达式对地图进行排序
【发布时间】:2018-09-20 14:20:16
【问题描述】:

我创建了一个带有 Comparator 的 Map 以按键排序,但在填充 Map 后,在填充数据后没有应用顺序。

SimpleDateFormat byDay = new SimpleDateFormat("ddMMyyyy");  

    Map<String, DoubleSummaryStatistics> menuStatisticsXDay = new TreeMap<String, DoubleSummaryStatistics>(

                        new Comparator<String>() {

                            @Override
                            public int compare(String dateStr1, String dateStr12) {
                                Date date1 = new Date();
                                Date date2 = new Date();
                                try {
                                    date1 = byDay.parse(dateStr1);
                                } catch (ParseException e) {
                                }
                                try {
                                    date2 = byDay.parse(dateStr1);
                                } catch (ParseException e) {
                                }

                                return date1.compareTo(date2);
                            }

                        });

                menuStatisticsXDay =
        menuPrices.stream().sorted(comparing(MenuPrice::getUpdateDate))
                                .collect(Collectors.groupingBy(cp -> byDay.format(cp.getUpdateDate()),
                                        Collectors.summarizingDouble(cp -> cp.getPriceInDouble())));

这样做它会对键进行排序,但作为字符串,所以“06092018”将比“07082018”排在前面,这就是为什么我想使用我的比较器,转换为日期并对其进行排序,然后“07082018”将排在第一位“06092018”:

Map<String, DoubleSummaryStatistics> menuStatisticsXDay =
        menuPrices.stream().sorted(comparing(MenuPrice::getUpdateDate))
                        .collect(Collectors.groupingBy(m -> byDay.format(m.getUpdateDate()),
                                 Collectors.summarizingDouble(m -> m.getPriceInDouble())))
                        .entrySet().stream()
                        .sorted(Map.Entry.comparingByKey())
                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(oldValue, newValue) -> oldValue, LinkedHashMap::new));

【问题讨论】:

  • 您的 TreeMap 无关紧要,因为您正在使用流操作返回的完全不同的 Map 引用覆盖 menuStatisticsXDay 变量。除此之外,您处理潜在ParseExceptions 的方式会导致不一致。

标签: lambda java-8 functional-programming java-stream


【解决方案1】:

然后使用 LocalDate 而不是 String 作为键:

Map<LocalDate, DoubleSummaryStatistics> menuStatisticsXDay =
                        menuPrices.stream().sorted(comparing(MenuPrice::getUpdateDate))
                                .collect(Collectors.groupingBy(m -> m.getUpdateLocalDate(),
                                         Collectors.summarizingDouble(m -> m.getPriceInDouble())))
                                .entrySet().stream()
                                .sorted(Map.Entry.comparingByKey())
                                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(oldValue, newValue) -> oldValue, LinkedHashMap::new));

【讨论】:

    【解决方案2】:

    你可以试试这个,

    menuStatisticsXDay = menuPrices.stream().sorted(comparing(MenuPrice::getUpdateDate))
        .collect(Collectors.groupingBy(cp -> byDay.format(cp.getUpdateDate()), LinkedHashMap::new
            Collectors.summarizingDouble(cp -> cp.getPriceInDouble())));
    

    LinkedHashMap 保持秩序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2016-07-22
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      相关资源
      最近更新 更多