Сведение списка в список с помощью API потока Java 8 - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий код, который может быть намного проще с использованием потокового API Java 8:

List<List<String>> listOfListValues;
public List<String> getAsFlattenedList() {
        List<String> listOfValues= new ArrayList<>();
        for (List<String> value: listOfListValues) {
            listOfValues.add(String.valueOf(value));
        }
        return listOfValues;
    }

Я искал решение для SO и нашел это:

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

Но этоне делает то, что я хочу.

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

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

  List<List<Integer>> listOfLists = new ArrayList<>();
    listOfLists.add(Arrays.asList(1,2,3,4,5));
    listOfLists.add(Arrays.asList(10,20,30,40));
    listOfLists.add(Arrays.asList(100,200,300,400));

    System.out.println(listOfLists);

    List<Integer> collect = listOfLists.stream().flatMap(Collection::stream).collect(Collectors.toList());
    System.out.println(collect);

И вывод: [[1, 2, 3, 4, 5], [10, 20, 30, 40], [100,200, 300, 400]]

[1, 2, 3, 4, 5, 10, 20, 30, 40, 100, 200, 300, 400]

0 голосов
/ 28 ноября 2018

Нет необходимости использовать плоскую карту.

listOfListValues.stream()
        .map(String::valueOf)
        .collect(Collectors.toList());

Объяснение: Функция flatMap объединяет операции map и flat.Это не нужно.Сглаживание означает преобразование чего-то вроде [ [1,2,3],[4,5,6,7],[8,9] ] в [ 1,2,3,4,5,6,7,8,9 ], т.е. преобразование двумерного массива в одномерный массив.

0 голосов
/ 28 ноября 2018

Вы можете сделать это так,

listOfListValues.stream().map(List::toString).collect(Collectors.toList());
0 голосов
/ 28 ноября 2018

Вам требуется только «простой» map здесь:

List<List<String>> listOfListValues;
public List<String> getAsFlattenedList() {
    return listOfListValues.stream()
            .map(String::valueOf)
            .collect(toList());
}

flatMap скорее используется для преобразования одного Stream в другой, что имеет смысл, если вам нужно больше записей или меньше, чемв настоящее время доступны (или только что недавно сопоставленные Stream для фильтрации / отображения / и т.д. далее), например:

  • подсчитать все уникальные строки всех списков:

    listOfListValues.stream()
                    .flatMap(List::stream) // we want to count all, also those from the "inner" list...
                    .distinct()
                    .count()
    
  • усечение записей после определенного размера:

    listOfListValues.stream()
            .flatMap(list -> {
                if (list.size() > 3) // in this case we use only some of the entries
                    return Stream.concat(list.subList(0, 2).stream(), Stream.of("..."));
                else
                    return list.stream();
            })
            .collect(Collectors.toList());
    
  • выравнивание значений карты для нескольких заинтересованных ключей:

    Map<Key, List<Value>> map = new HashMap<>();
    Stream<Value> valueStream = interestedKeys.stream()
                                              .map(map::get)
                                              .flatMap(List::stream);
    
...