在Java中将单个对象和对象列表合并到单个对象列表中
给定一个对象列表在Java中将单个对象和对象列表合并到单个对象列表中,java,list,arraylist,java-8,java-stream,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"); 显然,上述方法不起作用。如果只有两级嵌套,而不是递归地在列表中创建更深的列表, 那么这里有一种方法可以让
// ["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");
显然,上述方法不起作用。如果只有两级嵌套,而不是递归地在列表中创建更深的列表, 那么这里有一种方法可以让它变平:
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());
List flat=objects.stream()
.filter(对象::非空)
.flatMap(v->{
if(v instanceof String){
返回流.of((字符串)v);
}
return((List)v).stream().filter(Objects::nonNull);
})
.collect(Collectors.toList());
如果可以递归地进行更深层次的嵌套,
然后,您可以将上述内容封装在一个函数中,并递归地应用它(感谢您使其更加紧凑):
列表展平(列表对象){
返回objects.stream()
.filter(对象::非空)
.flatMap(字符串的v->v实例)
((串)v)的流
:展平((列表)v).stream()
.collect(Collectors.toList());
}
我们可以问一下,您是如何得到这种锯齿状列表数据结构的吗?它几乎感觉像是来自JSON,可能是。@TimBiegeleisen它来自一个对象映射,然后扁平化为一个对象列表,但是你想知道映射是如何产生的吗?如果有帮助的话,那么是JSON吗?列表
!!你应该检查所有可能的类型。其余的呢?JSON仍然以不同的方式对待数字,对吗?谢谢@janos!你认为你能挑战递归版本吗?或者更短的版本:List flatte(List objects){return objects.stream().filter(objects::nonNull).flatMap(v->v instanceof String?stream.of((String)v):flatte((List)v).stream()).collect(collector.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());
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());
}