Объединение отдельных объектов и списка объектов в единый список объектов в Java - PullRequest
0 голосов
/ 14 декабря 2018

Учитывая список объектов

// ["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()));

, очевидно, что вышеприведенное не сработало.

1 Ответ

0 голосов
/ 14 декабря 2018

Если существует только два уровня вложенности, а не более глубокие списки в списках рекурсивно, то есть один способ сгладить его:

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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...