基本上如果我有一些映射bifunction是否有这种操作的快捷方式(所以我不必编写3个嵌套循环)?
答案 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);
}