Создать списки из массивов из элементов по соответствующим индексам - PullRequest
1 голос
/ 10 апреля 2019

Я новичок в Java 8. Просто интересно, как бы я сделал ниже операции с использованием потоков Java 8.Любые предложения

public static void main(String[] args) {
    Integer[] arr1 = new Integer[]{1, 2, 3};
    Integer[] arr2 = new Integer[]{4, 5, 6};
    Integer[] arr3 = new Integer[]{7, 8, 9};

    for(int i=0; i<arr1.length; i++){
        System.out.println(listFromIndex(arr1[i], arr2[i], arr3[i]));
    }
}

private static List<Integer> listFromIndex(Integer e, Integer e1, Integer e2) {
    List<Integer> list = new ArrayList<>();
    list.add(e) ;
    list.add(e1) ;
    list.add(e2) ;
    return list;
}

Вывод:

[1, 4, 7]
[2, 5, 8]
[3, 6, 9]

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Если все массивы имеют одинаковую длину, вы можете использовать это:

List<Integer[]> arrays = Arrays.asList(arr1, arr2, arr3);
IntStream.range(0, arr1.length)
        .mapToObj(i -> arrays.stream().map(a -> a[i]).collect(Collectors.toList()))
        .forEach(System.out::println);

Это создает список, содержащий все массивы. После этого он создает поток, повторяющийся по всем массивам, и собирает новые массивы.

Будет напечатан следующий результат:

[1, 4, 7]
[2, 5, 8]
[3, 6, 9]

Если у вас есть массивы различной длины, вы можете использовать что-то вроде этого:

Integer[] arr1 = new Integer[]{1, 2, 3};
Integer[] arr2 = new Integer[]{4, 5};
Integer[] arr3 = new Integer[]{7};

List<Integer[]> arrays = Arrays.asList(arr1, arr2, arr3);
IntStream.range(0, arrays.stream().mapToInt(a -> a.length).max().orElseThrow())
        .mapToObj(i -> arrays.stream().map(a -> i < a.length ? a[i] : null).collect(Collectors.toList()))
        .forEach(System.out::println);

Здесь используется длина самого большого массива и проверяется i перед сбором полученных массивов.

Результат будет таким:

[1, 4, 7]
[2, 5, null]
[3, null, null]
1 голос
/ 10 апреля 2019

Предполагая, что массивы имеют одинаковую длину, вы можете сделать это следующим образом:

IntStream.range(0, arr1.length)
        .mapToObj(i -> listFromIndex(arr1[i], arr2[i], arr3[i]))
        .forEach(System.out::println);
...