Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将单个对象和对象列表合并到单个对象列表中_Java_List_Arraylist_Java 8_Java Stream - Fatal编程技术网

在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());
}