Lambda中的Java列表交集并收集对

时间:2019-01-26 21:39:00

标签: java

我有两个列表。 “ idOrderList”中的插入顺序也是“ idAndIndexList”所需的排序顺序。我在代码中将列表与下面的内容相交。

{
    List<String> idOrderList; //insertion order in this list is sort order
    List<Pair<String,Integer>> idAndIndexList; 
    //List intersection is done as below
    List resultList = 
        idOrderList.stream().filter(
            new HashSet<>(idAndIndexList.stream()
            .flatMap(o -> Stream.of(o.getLeft(),o.getRight()))
            .collect(Collectors.toList()))::contains)
        .collect(Collectors.toList());
}

我被困在如何将“ Pair.getRight()”收集到“ resultList”中,或者作为结果,我想收集“ idAndIndexList”对,但是要保持“ idOrderList”的插入顺序。 任何意见或建议。非常感谢

  • GS

1 个答案:

答案 0 :(得分:0)

最简单的方法是将idAndIndexList转换为其对应的right值集并使用Set.contains。这也避免了不必要地多次运行idAndIndexList.stream()管道:

Set<String> idSet = idAndIndexList.stream()
            .map(Pair::getLeft)
            .collect(Collectors.toSet());

List<String> resultList = idOrderList.stream()
        .filter(idSet::contains)
        .collect(Collectors.toList());
  

...或者,我想作为结果收集“ idAndIndexList”对,但保持“ idOrderList”的插入顺序

关于这种方法,您可以使用sorted并根据项目在idOrderList中的索引对它们进行排序:

List<String> resultList2 = idAndIndexList.stream()
        .map(Pair::getLeft)
        .sorted(Comparator.comparingInt(idOrderList::indexOf)) //be careful here
        .collect(Collectors.toList());

但是要特别注意的是,如果idAndIndexList包含重复项,则结果可能会超出您的预期。在这种情况下,第一种方法更可靠。