【问题标题】:Java8: collecting a stream into a SortedMap by keyJava8:通过键将流收集到SortedMap中
【发布时间】:2019-08-10 12:25:54
【问题描述】:

我想将一个流收集到一个对键进行排序的 Map 中,所以我尝试了:

TreeMap<LocalDate, MenuChart2.Statistics> last3MPerDay =    

                menuPriceByDayService.findAllOrderByUpdateDate(menu, DateUtils.quarterlyDate(), 92)
                .stream()
                .sorted(comparing(MenuPriceByDay::getUpdateDate))
                .collect(Collectors
                        .toMap(MenuPriceByDay::getUpdateLocalDate, p -> new MenuChart2().new Statistics( p.getMinPrice().doubleValue(), 

但是我得到一个编译错误

Type mismatch: cannot convert from Map<LocalDate,Object> to 
 TreeMap<LocalDate,MenuChart2.Statistics>

【问题讨论】:

  • 您需要使用接受地图供应商的重载toMap()
  • 请显示您的编译错误。

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


【解决方案1】:

如果您将数据存储在排序映射中,例如TreeMap,则无需创建流的.sorted() 版本;收集器自然会对数据进行排序,因为它将数据存储在TreeMap

您的.collect() 调用必须返回TreeMap 以便将结果分配给TreeMap,因此Collectors.toMap() 必须采用为收集器创建TreeMap 的供应商,以允许传播所需的类型。

例如)

jshell> String[] data = { "apple", "pear", "orange", "cherry" };
data ==> String[4] { "apple", "pear", "orange", "cherry" }

jshell> var map = Arrays.stream(data)
   ...>                 .collect(Collectors.toMap(s -> s,
   ...>                                           s -> s.length(),
   ...>                                           (a,b) -> a,
   ...>                                           TreeMap::new));
map ==> {apple=5, cherry=6, orange=6, pear=4}

生成的TreeMap 显示数据是按键排序的。

【讨论】:

    【解决方案2】:
    Map<LocalDate, MenuChart2.Statistics> last3MPerDay =    
    
                    menuPriceByDayService.findAllOrderByUpdateDate(menu, DateUtils.quarterlyDate(), 92)
                    .stream()
                    .sorted(comparing(MenuPriceByDay::getUpdateDate))
                    .collect(Collectors
                            .toMap(MenuPriceByDay::getUpdateLocalDate, p -> new MenuChart2().new Statistics( p.getMinPrice().doubleValue());
    
    TreeMap<LocalDate, , MenuChart2.Statistics> last3MPerDaySorted = new TreeMap<LocalDate, MenuChart2.Statistics>(last3MPerDay);
    

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 2016-12-25
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多