有没有一种很好的方法来转换List <list <list <integer>&gt;&gt;列出<list <list <string>&gt;&gt;没有3个嵌套循环?

时间:2018-05-22 12:41:20

标签: java

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

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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);
}