【问题标题】:Java - Flatten nested map using StreamJava - 使用 Stream 展平嵌套地图
【发布时间】:2017-08-22 12:53:30
【问题描述】:

我一直在使用 Java 8 Stream API 并遇到了一些我只能通过传统的 for 循环才能做到的事情。

给定一个嵌套的地图

{
    1999: {
             3: [23, 24, 25],
             4: [1, 2, 3]
          },
    2001: {
             11: [12, 13, 14],
             12: [25, 26, 27]

          }
}

我怎样才能把它变成

['23,3,1999', '24,3,1999', '25,3,1999', '1,4,1999', '2,4,1999', '3,4,1999', '12,11,2001', '13,11,2001', '14,11,2001', '25,12,2001', '26,12,2001', '27,12,2001']

基本上我想复制:

    Map<Integer, Map<Integer, List<Integer>>> dates...
    List<String> flattened = new ArrayList<>();
    for (Integer key1 : map.keySet()) {
        for (Integer key2 : map.get(key1).keySet()) {
            for (Integer value : map.get(key1).get(key2)) {
                flattened.add(value + "," + key2 + "," + key1);
            }
        }
    }

【问题讨论】:

    标签: java java-8 hashmap java-stream


    【解决方案1】:

    假设有一个 Holder 可以取 3 个整数,例如:

     static class Holder {
    
          private final int first;
          private final int second;
          private final int third;
     }
    

    这些是一些嵌套的地图,那么 2 flatMap 将实现你想要的:

     List<Holder> holders = map.entrySet().stream().flatMap(
                e -> e.getValue()
                        .entrySet()
                        .stream()
                        .flatMap(x -> x.getValue().stream().map(y -> new Holder(e.getKey(), x.getKey(), y))))
                .collect(Collectors.toList());
    
        System.out.println(holders);
    

    【讨论】:

      【解决方案2】:
       items
                  .entrySet()
                  .stream()
                  .flatMap(
                          l-> l.getValue().entrySet().stream()
                                  .flatMap(
                                          ll->ll.getValue().stream()
                                               .map(lll+","+ll.getKey()+","+l.getKey())))
                  .collect(Collectors.toList())
                  .forEach(System.out::println);
      

      【讨论】:

        【解决方案3】:

        试试这个例子:

        public static void main(String[] args) {
            Map<Integer, Map<Integer, List<Integer>>> dates =
                new HashMap<Integer, Map<Integer, List<Integer>>>() {{
                    put(1999, new HashMap<Integer, List<Integer>>() {{
                        put(3, Arrays.asList(23, 24, 25));
                        put(4, Arrays.asList(1, 2, 3));
                    }});
                    put(2001, new HashMap<Integer, List<Integer>>() {{
                            put(11, Arrays.asList(12, 13, 14));
                            put(12, Arrays.asList(25, 26, 27));
                    }});
                }};
        
            dates.entrySet().stream().flatMap(year ->
                year.getValue().entrySet().stream().flatMap(month ->
                    month.getValue().stream()
                        .map(day -> day + "," + month.getKey() + "," + year.getKey())))
                .forEach(System.out::println);
        }
        

        如果您需要它们按year 排序然后month 然后day 试试这个:

            dates.entrySet().stream().flatMap(year ->
                year.getValue().entrySet().stream().flatMap(month ->
                    month.getValue().stream()
                        .map(day -> Arrays.asList(year.getKey(), month.getKey(), day))))
                .sorted(Comparator.comparing(l -> l.get(0)*10000 + l.get(1)*100 + l.get(2)))
                .forEach(System.out::println);
        

        【讨论】:

          猜你喜欢
          • 2018-07-10
          • 2021-06-01
          • 2015-04-18
          • 2016-02-18
          • 2015-01-28
          • 2021-11-28
          • 1970-01-01
          • 2015-10-29
          • 1970-01-01
          相关资源
          最近更新 更多