Java8 lambda两个集合减

问题描述 投票:0回答:2

DTO

public class Result {
    private List<Module> modules;
}

public class Module {
    private String name;
    private List<TestCase> testCases;
}

public class TestCase {
    private String name;
    private String result;
}

假设我有两个项目,

<!-- Result1 -->
<Result>
    <Module name="a">
        <TestCase name="tc1" result="pass"/>
        <TestCase name="tc2" result="pass"/>
    </Module>
    <Module name="b">
        <TestCase name="tc1" result="pass"/>
        <TestCase name="tc2" result="pass"/>
        <TestCase name="tc3" result="pass"/>
    </Module>
</Result>

<!-- Result2 -->
<Result>
    <Module name="a">
        <TestCase name="tc1" result="pass"/>
    </Module>
</Result>

我想得到两个集合Result1和Result2的交集

(例如result1.intersection(result2)

结果

<Result>
    <Module name="a">
        <TestCase name="tc2" result="pass"/>
    </Module>
    <Module name="b">
        <TestCase name="tc1" result="pass"/>
        <TestCase name="tc2" result="pass"/>
        <TestCase name="tc3" result="pass"/>
    </Module>
</Result>

我知道如何将这两个集合相交。但是,如果存在收藏集,我不知道如何相交。

如何使用Java 8流执行此操作?或其他方式?

java
2个回答
0
投票

您应该为您的Module类实现equals方法,然后可以使用与此类似的方法:

public Result intersection(Result r1, Result r2) {
    Result result = new Result();

    r1.getModules().forEach(module -> {
      if (r2.getModules().contains(module)) {
        result.getModules().add(module);
      }
    });
    return result;
  }

0
投票

Java 8代码查找交集

Set<Result> result = list.stream()
  .distinct()
  .filter(otherList::contains)
  .collect(Collectors.toSet());

由于Result是一个自定义类,因此要使交叉口正常工作,您需要实现equals()hashcode()

https://www.baeldung.com/java-equals-hashcode-contracts

但是内部Module将使用equalshascode检查是否相等,如果未提供,则从Object类.....总的来说,为了满足您的要求,您需要在所有3个类别中都实现equals()hashcode(),即ResultModuleTestCase

© www.soinside.com 2019 - 2024. All rights reserved.