我们可以从Java 8流中收集两个列表吗?

时间:2018-08-04 06:25:15

标签: java java-8 java-stream

考虑一下,我有一个包含两种数据类型的列表,一种有效,另一种无效。

如果我开始过滤此列表,可以在末尾收集两个列表吗?

4 个答案:

答案 0 :(得分:5)

  

我们可以从Java 8流中收集两个列表吗?

您只能,如果有一种方法可以根据条件对List的元素进行分组。 例如,在这种情况下,您可以使用Collectors.groupingBy()来返回Map<Foo, List<Bar>>,其中Map的值是两个List。

请注意,在您的情况下,您不需要流即可仅进行过滤。

使用removeIf()过滤无效列表,并将其所有元素添加到第一个列表中:

invalidList.removeIf(o -> conditionToRemove);
goodList.addAll(invalidList);      

如果您不想更改goodList的状态,可以对其进行浅表复制:

invalidList.removeIf(o -> conditionToRemove);
List<Foo> terminalList = new ArrayList<>(goodList);
terminalList.addAll(invalidList);

答案 1 :(得分:2)

收集器只能返回一个对象!

但是您可以创建一个自定义收集器,将流元素简单地放入两个列表中,然后返回包含这两个列表的列表列表。

examples的实现方法很多。

答案 2 :(得分:1)

另一个建议:使用lambda进行过滤,该过滤器将要从流中过滤掉的元素添加到单独的列表中。

答案 3 :(得分:0)

这是使用Java 8流API的一种方式。考虑一下我有List个元素,其中String个元素:输入列表中包含各种长度的字符串;只有长度为3的字符串才有效。

List<String> input = Arrays.asList("one", "two", "three", "four", "five");
Map<Boolean, List<String>> map = input.collect(Collectors.partitioningBy(s -> s.length() == 3));
System.out.println(map); // {false=[three, four, five], true=[one, two]}

产生的Map仅具有 两条记录;一个带有有效的输入列表元素,另一个带有无效的输入列表元素。带有 key = true 的地图记录的有效字符串为List:1、2。另一个是 key = false 和无效的字符串:三个,四个,五个。

请注意,Collectors.partitioningBy总是在结果映射中产生两条记录,而不管是否存在有效或无效值。