Java流:收集嵌套集合

时间:2017-11-04 17:38:12

标签: java lambda stream

我正在学习如何使用Java流,并需要一些帮助来了解如何流式传输嵌套集合并将结果收集回集合中。

在下面的简单示例中,我创建了2个ArrayLists并将它们添加到ArrayList中。我希望能够在每个嵌套集合上执行一个简单的函数,然后将结果捕获到一个新集合中。最后一行代码甚至没有编译。任何解释都将不胜感激!

    ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2,3));
    ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(4,5,6));

    ArrayList<ArrayList<Integer>> nested = new ArrayList<ArrayList<Integer>>();
    nested.add(list1);
    nested.add(list2);

    ArrayList<ArrayList<Integer>> result = nested.stream()
            .map(list -> list.add(100))
            .collect(Collectors.toList());

2 个答案:

答案 0 :(得分:2)

问题是List#add没有返回List。相反,您需要在映射后返回列表:

List<ArrayList<Integer>> result = nested.stream()
        .map(list -> {
            list.add(100);
            return list;
        })
        .collect(Collectors.toList());

或者您可以跳过使用map并使用forEach进行操作,因为ArrayList是可变的:

nested.forEach(list -> list.add(100));

答案 1 :(得分:0)

您可以使用Stream.of()执行此操作,而无需事先创建嵌套的限制。

        List<ArrayList<Integer>> nestedList = Stream.of(list1, list2)
            .map(list -> {list.add(100); return list;})
            .collect(Collectors.toList());

并且可能将地图操作提取到单独的函数中。