java - 将单个对象和对象列表合并到Java中的单个对象列表中
问题描述
给定一个对象列表
// ["A", ["B", null, "C"], "D", ["E"], [], null, "F"];
List<Object> objects = Arrays.asList("A", Arrays.asList("B", null, "C"), "D", Arrays.asList("E"), Arrays.asList(), null, "F");
有没有一种简单的方法可以将非空值组合成一个列表["A", "B", "C", "D", "E", "F"]
?
你们中的一些人坚持帖子必须显示尝试过的内容
objects.stream().map(o -> {
if (o instanceof List) {
return ((List) o).stream();
} else return objects.stream();
}).filter(Objects::nonNull).collect(Collectors.toList()));
显然以上没有奏效。
解决方案
如果只有两层嵌套,而不是递归列表中更深的列表,那么这是一种扁平化它的方法:
List<String> flat = objects.stream()
.filter(Objects::nonNull)
.flatMap(v -> {
if (v instanceof String) {
return Stream.of((String) v);
}
return ((List<String>) v).stream().filter(Objects::nonNull);
})
.collect(Collectors.toList());
如果可以递归嵌套更深层次,那么您可以将上述内容包装在一个函数中并递归应用它(感谢@Holger使其更紧凑):
List<String> flatten(List<?> objects) {
return objects.stream()
.filter(Objects::nonNull)
.flatMap(v -> v instanceof String
? Stream.of((String) v)
: flatten((List<?>) v).stream())
.collect(Collectors.toList());
}
推荐阅读
- javascript - 在 Promise Rejection (Typescript) 中返回未处理的错误
- pandas - 如何运行 pandas-Koalas 程序起诉 spark-submit(windows)?
- python - VScode 在 python 中给出了这个警告,该行运行良好,但警告仍然存在
- javascript - Axios.get() ReactJS
- excel - 如何遍历 VBA 中的所有过滤器选项?
- javascript - React - 如何强制重新加载类组件?
- react-native - react-native-community/asyncStorage removeItem 导致程序行为异常
- python - Django - 按字段比较用户对象
- swiftui - 如何从 SwiftUI 中的 apns 点击导航到某些视图?
- python - SkImage 中 cv2.INTER_AREA 的等价物