Java8:按键将流收集到SortedMap中

时间:2019-03-19 21:16:08

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

我想将流收集到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>

2 个答案:

答案 0 :(得分:5)

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

您的.collect()调用必须返回TreeMap才能将结果分配给TreeMap,因此Collectors.toMap()必须接受创建{{1 }}收集器,以允许传播所需的类型。

例如)

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} 显示数据是按键排序的。

答案 1 :(得分:1)

<View style={editProfileStyle.pickerView}>
            <Picker
              style={{
                ...Platform.select({
                  android: {
                    color: "#000"
                  }
                })
              }}
              enabled={true}
              selectedValue={this.state.Qualification}
              onValueChange={this.updateState}
              mode="dropdown"
              itemStyle={{ height: 80, color: "#000000" }}
            >
                {this.state.options.map((item, index) => {
                    return <Picker.Item value={item} key={index} label={item} />;
                })}
            </Picker>
          </View>