Вопрос-ответ

How can I turn a List of Lists into a List in Java 8?

Как я могу превратить список списков в список в Java 8?

Если у меня есть List<List<Object>>, как я могу превратить его в List<Object> который содержит все объекты в том же порядке итерации, используя возможности Java 8?

Переведено автоматически
Ответ 1

Вы можете использовать flatMap для объединения внутренних списков (после преобразования их в потоки) в единый поток, а затем собрать результат в список:

List<List<Object>> list = ...
List<Object> flat =
list.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
Ответ 2

flatMap Метод на Stream, безусловно, может сгладить эти списки для вас, но он должен создать Stream объекты для элемента, затем a Stream для результата.

Вам не нужны все эти Stream объекты. Вот простой и лаконичный код для выполнения задачи.

// listOfLists is a List<List<Object>>.
List<Object> result = new ArrayList<>();
listOfLists.forEach(result::addAll);

Поскольку a List is Iterable, этот код вызывает forEach метод (функция Java 8), который унаследован от Iterable.


Выполняет указанное действие для каждого элемента Iterable до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение. Действия выполняются в порядке итерации, если этот порядок указан.


А List's Iterator возвращает элементы в последовательном порядке.

Для Consumer этот код передает ссылку на метод (функция Java 8) в метод до Java 8 List.addAll для последовательного добавления элементов внутреннего списка.


Добавляет все элементы в указанной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором указанной коллекции (необязательная операция).


Ответ 3

flatmap лучше, но есть и другие способы добиться того же

List<List<Object>> listOfList = ... // fill

List<Object> collect =
listOfList.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
Ответ 4

Метод преобразования List<List> в List :

listOfLists.stream().flatMap(List::stream).collect(Collectors.toList());

Смотрите этот пример:

public class Example {

public static void main(String[] args) {
List<List<String>> listOfLists = Collections.singletonList(Arrays.asList("a", "b", "v"));
List<String> list = listOfLists.stream().flatMap(List::stream).collect(Collectors.toList());

System.out.println("listOfLists => " + listOfLists);
System.out.println("list => " + list);
}

}

Он выводит:

listOfLists => [[a, b, c]]
list => [a, b, c]

В Python это можно сделать, используя понимание списка.

list_of_lists = [['Roopa','Roopi','Tabu', 'Soudipta'],[180.0, 1231, 2112, 3112], [130], [158.2], [220.2]]

flatten = [val for sublist in list_of_lists for val in sublist]

print(flatten)
['Roopa', 'Roopi', 'Tabu', 'Soudipta', 180.0, 1231, 2112, 3112, 130, 158.2, 220.2]
java collections java-8