use*_*188 -1 java list arraylist java-8 java-stream
给出一个对象列表
// ["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");
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以将非空值组合到一个列表中["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()));
Run Code Online (Sandbox Code Playgroud)
显然上面没有用.
如果只有两个级别的嵌套,而不是递归的列表中更深的列表,那么这是一种展平它的方法:
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());
Run Code Online (Sandbox Code Playgroud)
如果可以递归地进行更深层次的嵌套,那么你可以将上面的内容包装在一个函数中并递归地应用它(感谢@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());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |