繁体   English   中英

将单个对象和对象列表合并为Java中的单个对象列表

[英]Merge single objects and list of objects into a single list of objects in 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");

有没有简单的方法可以将非null值组合到单个列表中["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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM