使用Java 8流迭代不同长度的列表

时间:2018-08-28 10:19:32

标签: java-8 java-stream

我正在尝试遍历三个不同大小的列表,但没有获得如何从它们检索数据并将其存储在另一个列表中的确切逻辑。 在向元素添加更多过滤之前,我最多可以处理两个列表。目前,我正在使用3 for循环,但是如果可能的话,我想使用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 :(得分:0)

尝试用List创建多维数组,从那里也可以使用流

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]

答案 1 :(得分:0)

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]