Как преобразовать вложенный массив во вложенный список с помощью лямбда? - PullRequest
2 голосов
/ 14 июля 2020

Обновление : используйте Integer[][], поскольку тип массива sr c может заставить работать следующий код.

Я хочу преобразовать int[][] в List<List<Integer>> и попробовал:

int[][] arr = new int[][]{{2}, {3, 4}, {6, 5, 7}, {4, 1, 8, 3}};
List<List<Integer>> ll = Arrays.stream(arr)
        .map(Arrays::asList) //  I expect this produces Stream<List<Integer>> but it was actually a Stream<List<int[]>>.
        .collect(Collectors.toList());

компилятор выдает ошибку:

|  Error:
|  incompatible types: inference variable T has incompatible bounds
|      equality constraints: java.util.List<java.lang.Integer>
|      lower bounds: java.util.List<int[]>
|          List<List<Integer>> ll = Arrays.stream(arr).map(Arrays::asList).collect(Collectors.toList());
|                                   ^-----------------------------------------------------------------^

1 Ответ

6 голосов
/ 14 июля 2020

Arrays.asList не работает с примитивами (по крайней мере, не так, как вы предполагали: Arrays.asList(new int[n]) - это List<int[]> с одним элементом, а не List<Integer> с n элементами).

Вместо этого сопоставьте с IntStream (чтобы дать вам IntStream), упакуйте элементы (чтобы получить Stream<Integer>) и собрать в список (чтобы получить List<Integer>:

List<List<Integer>> ll = Arrays.stream(arr)
    .map(a -> IntStream.of(a).boxed().collect(toList()))
    .collect(toList());

Обратите внимание, что если вы используете Guava, вы можете использовать Ints.asList:

List<List<Integer>> ll = Arrays.stream(arr)
    .map(Ints::asList)
    .collect(toList());

Другие библиотеки также могут иметь методы int[] -> List<Integer>; это всего лишь тот, о существовании которого я знаю.

...