【问题标题】:create nested hashmap using lambda expression使用 lambda 表达式创建嵌套的 hashmap
【发布时间】:2018-05-14 05:14:56
【问题描述】:

我想在 Java 中使用来自输入 ArrayList 的 lambda 表达式创建三层 HashMap。这三层是年、月和周,这是我前两层的代码。然而,在第二层我得到一个错误(第一层工作正常)。

public HashMap<Integer,HashMap<Integer,HashMap<Integer,AbcDetails>>> createHashMapOfTimePeriod(List<AbcDetails> abcDetails){

    Map<Integer,List<AbcDetails>>result1=abcDetails.stream().collect(Collectors.groupingBy(AbcDetails::getYear));
    Map<Integer,Map<Integer,AbcDetails>>reult2=result1.entrySet().stream().collect(Collectors.groupingBy(e -> (e.getValue().stream().collect(Collectors.groupingBy(AbcDetails::getWeek)))));

    return null;

}

【问题讨论】:

    标签: java lambda collections java-8 hashmap


    【解决方案1】:

    您可以使用嵌套的Collectors 实现此目的:

    Map<Integer,Map<Integer,Map<Integer,AbcDetails>>> groups = 
      abcDetails.stream ()
            .collect(Collectors.groupingBy (AbcDetails::getYear,
                                            Collectors.groupingBy (AbcDetails::getMonth,
                                                                   Collectors.toMap (AbcDetails::getWeek, Function.identity()))));
    

    请注意,如果可能有多个AbcDetails 实例具有相同的年、月和周,则内部Map 将有多个相同键的值,因此上述代码将失败。解决此类问题的一种方法是将输出更改为:

    Map<Integer,Map<Integer,Map<Integer,List<AbcDetails>>>> groups = 
      abcDetails.stream ()
            .collect(Collectors.groupingBy (AbcDetails::getYear,
                                            Collectors.groupingBy (AbcDetails::getMonth,
                                                                   Collectors.groupingBy (AbcDetails::getWeek))));
    

    【讨论】:

    • 但是在第二层和第三层数据是重复的,只有年份是唯一的,在这里有效吗?
    • @shridhar 唯一的问题可能是最里面的地图。如果有多个对象具有相同的年、月和周,您将在最里面的地图中有一个重复的键,并且必须决定如何解决它。您可以将结构更改为 Map&lt;Integer,Map&lt;Integer,Map&lt;Integer,List&lt;AbcDetails&gt;&gt;&gt;&gt; 以解决此类重复键。
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多