Stream API:使用枚举中的键创建空映射

时间:2016-12-05 12:51:13

标签: java dictionary enums java-8

我有以下枚举:

import copy

dict_of_df = {}
for ym in [201511, 201612, 201710]:

    key_name = 'df_new_'+str(ym)    

    dict_of_df[key_name] = copy.deepcopy(df)

    to_change = df['YearMonth']< ym
    dict_of_df[key_name].loc[to_change, 'new_col'] = ym   

dict_of_df.keys()
Out[36]: ['df_new_201710', 'df_new_201612', 'df_new_201511']

dict_of_df
Out[37]: 
{'df_new_201511':     A    B  ID                       t  YearMonth  new_col
 0  -a    a   1 2016-12-05 07:53:35.943     201612   201612
 1   1  NaN   2 2016-12-05 07:53:35.943     201612   201612
 2   a    c   2 2016-12-05 07:53:35.943     201612   201612,
 'df_new_201612':     A    B  ID                       t  YearMonth  new_col
 0  -a    a   1 2016-12-05 07:53:35.943     201612   201612
 1   1  NaN   2 2016-12-05 07:53:35.943     201612   201612
 2   a    c   2 2016-12-05 07:53:35.943     201612   201612,
 'df_new_201710':     A    B  ID                       t  YearMonth  new_col
 0  -a    a   1 2016-12-05 07:53:35.943     201612   201710
 1   1  NaN   2 2016-12-05 07:53:35.943     201612   201710
 2   a    c   2 2016-12-05 07:53:35.943     201612   201710}

 # Extract a single dataframe
 df_2015 = dict_of_df['df_new_201511']

我想使用public enum ProductType { RED_MEAT, POULTRY, FISH, EGGS, NUTS, DAIRY, CERIALS_AND_GRAINS, FRUIT, VEGETABLES, OIL_AND_SUGARS } 和null值创建带有键的地图。我根据this answer尝试了以下代码:

enum

但我在这里得到Map<ProductType, DietFrequency> diet = Arrays.stream(ProductType.values()) .collect(Collectors.toMap(productType -> productType, value -> null)); 。我究竟做错了什么?

1 个答案:

答案 0 :(得分:3)

我非常确定EnumMap更适合您的需求。

Map<ProductType, DietFrequency> diet = new EnumMap<>(ProductType.class);

对于枚举值,EnumMap比HashMap更有效。默认情况下,不存在映射。根据您的使用情况,可能没问题(map.get(RED_MEAT)返回null,这似乎是您想要的),但是如果您想要执行containsKey()检查或循环条目,那么您就可以了必须将映射显式设置为null:

Arrays.stream(ProductType.values()).forEach(v-> diet.put(v, null));