Vavr - превратить список списков в один список - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть два списка vavr:

List<Object> list1 = List.of("one", "two", "three", "for");
List<Object> list2 = List.of("one", "two", List.of("three", "for"));

Как я могу преобразовать list2 в значение list1?

РЕДАКТИРОВАТЬ

Я пытаюсь объяснить больше, чего я хочу достичь:

System.out.println("list1: " + list1);
System.out.println("list2: " + list2);

Вывод:

list1: List(one, two, three, for)
list2: List(one, two, List(three, for))

Я хочу сгладить все внутренние списки в list2,поэтому сплющенный список должен быть равен list1:

System.out.println("flattened: " + flattened);
System.out.println(list1.equals(flattened));

Должен возвращаться:

flattened: List(one, two, three, for)
true

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

С Vavr вам не нужны все шаблоны потока / сбора JDK:

List<Object> result = list2.flatMap(o -> o instanceof List ? ((List) o) : List.of(o));
0 голосов
/ 05 февраля 2019

Вы можете использовать Stream с flatMap:

List<Object> flattened =
    list2.stream()
         .flatMap(e -> ((e instanceof List) ? ((List<Object>)e).stream() : Stream.of(e)))
         .collect(Collectors.toList());
System.out.println(flattened);
System.out.println(list1.equals(flattened));

Выходы:

[one, two, three, four]
true

РЕДАКТИРОВАТЬ:

Поскольку OP использует другойList, вот аналогичное решение для io.vavr.collection.List:

List<Object> flattened =
    list2.toStream()
         .flatMap(e -> ((e instanceof List) ? ((List<Object>)e).toStream() : Stream.of(e)))
         .collect(List.collector());
...