Итерация списков различной длины с использованием потоков Java 8 - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь перебрать три списка разного размера, но не получаю точную логику того, как я могу извлечь из них данные и сохранить в другом списке. Мне удалось обработать до двух списков, пока я не добавлю еще немного фильтрации к элементам. Сейчас я использую 3 для циклов, но я хочу использовать потоки Java 8, если это возможно. Может кто-нибудь предложить мне правильную логику для приведенных ниже итераций.

public class CustomDto {

public static void main(String... args) {

    List<String> list1 = Arrays.asList("Hello", "World!");
    List<String> list2 = Arrays.asList("Hi", "there");
    List<String> list3 = Arrays.asList("Help Me");
    Map<Integer, Object> map = new HashMap<>();

    for (int i = 0; i < list1.size(); i++) {
        List<String> list4 = new LinkedList();
        for (int j = 0; j < list2.size(); j++) {

            for (int k = 0; k < list3.size(); k++) {

                if (!(list2.get(j).equals(list3.get(k))))
                    list4.add(list2.get(j));
            }

            if (j > list4.size() - 1) {
                list4.add(null);
            }
        }
        map.put(i, list4);
    }
}

}

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

Ответы [ 2 ]

0 голосов
/ 29 августа 2018
public static void main(String... args) {
    List<String> list1 = Arrays.asList("Hello", "World!");
    List<String> list2 = Arrays.asList("Hi", "there");
    List<String> list3 = Arrays.asList("Help Me");

    List<String> list4 = concat(list1, list2, list3); //you can add as many lists as you like here
    System.out.println(list4);
}

private static List<String> concat(List<String>... lists) {
    return Stream.of(lists)
            .flatMap(List::stream)
            .collect(Collectors.toList());
}

выход

[Hello, World!, Hi, there, Help Me]
0 голосов
/ 28 августа 2018

Попробуйте создать массив из измерений из списка, оттуда вы также можете использовать поток

Customdto[][] listArray = new Customdto[][]{  l1.toArray(new Customdto[]{})
        ,  l2.toArray(new Customdto[]{}),  l3.toArray(new Customdto[]{})};
    int size = listArray[0].length > listArray[1].length && listArray[0].length > listArray[2].length ?listArray[0].length
            :(listArray[1].length > listArray[2].length ? listArray[1].length:listArray[2].length);
    for(int i = 0; i <size;i++)
    {
        if(listArray[0].length >i && listArray[1].length >i && listArray[2].length >i &&
                listArray[0][i].equals(listArray[1][i]) 
                && listArray[1][i].getCalendarDate().equals(listArray[2][i].getCalendarDate()))
        {
            l4.add(listArray[1][i]);
        }else
        {
            l4.add(null);
        }
    }

Попробовал с нижним вводом

List<Customdto> l1 = new ArrayList<Customdto>();
        List<Customdto> l2 = new ArrayList<Customdto>();
        List<Customdto> l3 = new ArrayList<Customdto>();
        List<Customdto> l4 = new ArrayList<Customdto>();
        l1.add(new Customdto(1));
        l1.add(new Customdto(2));
        l1.add(new Customdto(3));
        l1.add(new Customdto(4));
        l2.add(new Customdto(1));
        l2.add(new Customdto(2));
        l2.add(new Customdto(3));
        l3.add(new Customdto(1));
        l3.add(new Customdto(2));

Вывод

[Customdto [id=1], Customdto [id=2], null, null]
...