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

java collections java-8

211424 просмотра

8 ответа

3016 Репутация автора

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

Автор: Sarah Szabo Источник Размещён: 05.08.2014 07:48

Ответы (8)


771 плюса

303946 Репутация автора

Решение

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

List<List<Object>> list = ...
List<Object> flat = 
    list.stream()
        .flatMap(List::stream)
        .collect(Collectors.toList());
Автор: Eran Размещён: 05.08.2014 07:50

13 плюса

1088 Репутация автора

Вы можете использовать flatCollect()шаблон из Eclipse Collections .

MutableList<List<Object>> list = Lists.mutable.empty();
MutableList<Object> flat = list.flatCollect(each -> each);

Если вы не можете изменить список из List:

List<List<Object>> list = new ArrayList<>();
List<Object> flat = ListAdapter.adapt(list).flatCollect(each -> each);

Примечание: я участвую в коллекциях Eclipse.

Автор: Nikhil Nanivadekar Размещён: 27.03.2016 12:04

40 плюса

9129 Репутация автора

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

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

List<Object> collect = 
      listOfList.stream()
                .collect(ArrayList::new, List::addAll, List::addAll);
Автор: Saravana Размещён: 03.11.2016 07:04

5 плюса

357 Репутация автора

Я просто хочу объяснить еще один сценарий , как List<Documents>, этот список содержит еще несколько списков других документов , таких как List<Excel>, List<Word>, List<PowerPoint>. Итак, структура

class A {
  List<Documents> documentList;
}

class Documents {
  List<Excel> excels;
  List<Word> words;
  List<PowerPoint> ppt;
}

Теперь, если вы хотите перебрать Excel только из документов, сделайте что-то вроде ниже.

Так что код будет

 List<Documents> documentList = new A().getDocumentList();

 //check documentList as not null

 Optional<Excel> excelOptional = documentList.stream()
                         .map(doc -> doc.getExcel())
                         .flatMap(List::stream).findFirst();
 if(excelOptional.isPresent()){
   Excel exl = optionalExcel.get();
   // now get the value what you want.
 }

Я надеюсь, что это может решить чью-то проблему во время кодирования ...

Автор: Kushwaha Размещён: 14.12.2017 09:17

18 плюса

155307 Репутация автора

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

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

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

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

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

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

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

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

Автор: rgettman Размещён: 11.05.2018 11:04

6 плюса

3352 Репутация автора

Так же, как @Saravana упомянул:

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

 listStream.reduce(new ArrayList<>(), (l1, l2) -> {
        l1.addAll(l2);
        return l1;
 });

Подводя итог, есть несколько способов добиться того же:

private <T> List<T> mergeOne(Stream<List<T>> listStream) {
    return listStream.flatMap(List::stream).collect(toList());
}

private <T> List<T> mergeTwo(Stream<List<T>> listStream) {
    List<T> result = new ArrayList<>();
    listStream.forEach(result::addAll);
    return result;
}

private <T> List<T> mergeThree(Stream<List<T>> listStream) {
    return listStream.reduce(new ArrayList<>(), (l1, l2) -> {
        l1.addAll(l2);
        return l1;
    });
}

private <T> List<T> mergeFour(Stream<List<T>> listStream) {
    return listStream.reduce((l1, l2) -> {
        List<T> l = new ArrayList<>(l1);
        l.addAll(l2);
        return l;
    }).orElse(new ArrayList<>());
}

private <T> List<T> mergeFive(Stream<List<T>> listStream) {
    return listStream.collect(ArrayList::new, List::addAll, List::addAll);
}
Автор: Hearen Размещён: 25.06.2018 10:35

1 плюс

338 Репутация автора

Метод преобразования Преобразовать список списков в список: ListOfLists.stream (). FlatMap (List :: stream) .collect (Collectors.toList ()); Пример 1:

    public class ConvertListOfListsToList {
        public static void main(String[] args) {
            List<String> StringList = Arrays.asList("Protijayi", "Gini", "Gina");
            System.out.println(StringList);
            List<List<String>> ListOfLists = new ArrayList<>();
            ListOfLists.add(StringList);

            System.out.println("ListOfLists => " + ListOfLists);

            // Now let's do this in Java 8 using FlatMap
            List<String> flatMapList = ListOfLists.stream().flatMap(List::stream).collect(Collectors.toList());

            System.out.println("FlatList =>  " + flatMapList);
/*
ListOfLists => [[Protijayi, Gini, Gina]]
FlatList =>  [Protijayi, Gini, Gina]
*/
        }

    }
Автор: Soudipta Dutta Размещён: 19.03.2019 01:30

0 плюса

1 Репутация автора

Мы можем использовать flatmap для этого, пожалуйста, обратитесь ниже код:

 List<Integer> i1= Arrays.asList(1, 2, 3, 4);
 List<Integer> i2= Arrays.asList(5, 6, 7, 8);

 List<List<Integer>> ii= Arrays.asList(i1, i2);
 System.out.println("List<List<Integer>>"+ii);
 List<Integer> flat=ii.stream().flatMap(l-> l.stream()).collect(Collectors.toList());
 System.out.println("Flattened to List<Integer>"+flat);
Автор: Pratik Pawar Размещён: 25.07.2019 12:08
Вопросы из категории :
32x32