代码之家  ›  专栏  ›  技术社区  ›  Alex Kokorin

有没有一种很好的方法可以将list<list<list<integer>>转换为list<list<string>>w/o 3嵌套循环?[关闭]

  •  0
  • Alex Kokorin  · 技术社区  · 7 年前

    基本上,如果我有一些映射双功能,有没有这种操作的快捷方式(所以我不必编写3个嵌套循环)?

    2 回复  |  直到 7 年前
        1
  •  9
  •   jahra    7 年前
    List<List<List<String>>> collect = list
                .stream()
                .map(a -> a
                        .stream()
                        .map(b -> b
                                .stream()
                                .map(String::valueOf)
                                .collect(Collectors.toList()))
                        .collect(Collectors.toList()))
                .collect(Collectors.toList());
    
        2
  •  7
  •   assylias    7 年前

    另一种方法是使用递归方法,该方法沿着列表树向下搜索,一旦找到一个非列表的列表(在本例中是整数),它就会将其转换为字符串:

    public static List<?> mapToString(List<?> list) {
      return list.stream()
                 .map(x -> {
                        if (x instanceof List) return mapToString((List) x);
                        else return String.valueOf(x);
                      })
                 .collect(toList());
    }
    

    请注意,它适用于 List<List<List<List<List<List<Integer>>>>>> 如果你喜欢那种恐怖。

    缺点是它不像以前那样类型安全,所以您需要一个演员表。


    例子:

    public static void main(String... args) throws Exception {
      List<List<List<Integer>>> input = new ArrayList<> ();
      input.add(new ArrayList<> ());
      input.add(new ArrayList<> ());
    
      input.get(0).add(Arrays.asList(1, 2));
      input.get(1).add(Arrays.asList(3, 4));
    
      List<List<List<String>>> result = (List<List<List<String>>>) mapToString(input);
      System.out.println(result);
    }