在Java8中使用Lambda表达式订购地图

时间:2018-09-20 14:20:16

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

我已经创建了一个带有Comparator的地图,可以通过键对其进行排序,但是在填充地图后,在填充数据之后便不再应用任何顺序。

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”首先,这就是为什么我要使用我的比较器,将其转换为Date并对其进行排序,然后“ 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));

2 个答案:

答案 0 :(得分:2)

然后使用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));

答案 1 :(得分:1)

您可以尝试一下,

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

LinkedHashMap保持顺序。