有没有一种很好的方法将List <List <List <Integer >>>转换为List <List <List <String >>>没有3个嵌套循环?

Ale*_*rin 0 java

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

jah*_*hra 9

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());
Run Code Online (Sandbox Code Playgroud)

  • 3个循环与3个流..我看到没有区别,真的. (5认同)
  • 在这种情况下,@ ifly6并没有*那么多*实际关心的速度慢,但是这个流解决方案也可能比for循环更不易读取,这在stream-api中并不常见 (5认同)
  • jahra,我赞成你的回答.我认为一分钟的解决方案并不差,也不差,等等.这是解决问题的好方法.只是这里的流是完全没必要的,并且Java8对Java环境的奇怪厌恶也是不必要的. (4认同)

ass*_*ias 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());
}
Run Code Online (Sandbox Code Playgroud)

请注意,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);
}
Run Code Online (Sandbox Code Playgroud)