Assert Equalsusing stream具有多个字段的不同类型的列表

时间:2017-01-12 05:12:45

标签: java java-stream

public class OrdersDto implements java.io.Serializable {
    /** Id **/
    private Long screening;
    private Long category;
    private TestMastDto testMast;
    /** getters & setters/ constructor */
}

public class TestMastDto implements java.io.Serializable {
    /** Id **/
    private Long testId;    
    /** getters & setters/ constructor */
}

还有另一种POJO格式

public class ReviewMedicalConfigDto implements Serializable {
    /** Id **/
    private Long jobCategoryId;
    private Long screeningTypeId;
    private Long testId;
}

我有List<OrdersDto> and a List<ReviewMedicalConfigDto>,如何使用java流或java中的任何其他有效方式比较不同类型列表中的testId,screeningTypeId,jobCategoryId

仅针对testId尝试此操作,该testId提供了类强制转换异常

 boolean isConfigTest = orders.stream().map(orObj -> orObj.getTestMast().getTestId())
                     .collect(Collectors.toList()).equals(reviewMedicalConfigDtos.stream().map( rmObj -> rmObj.getTestId() ));

异常java.lang.ClassCastException:om.gov.moh.services.dto.ReviewMedicalStatusDto无法强制转换为om.gov.moh.services.dto.OrdersDto

1 个答案:

答案 0 :(得分:1)

一般模式是

boolean match = list1.size() == list2.size() &&
    IntStream.range(0, list1.size()).allMatch( index -> {
        FirstType  a = list1.get(index);
        SecondType b = list2.get(index);
        return Objects.equals(a.getProperty1(), b.getProperty1())
            && Objects.equals(a.getProperty2(), b.getProperty2())
            && Objects.equals(a.getProperty3(), b.getProperty3());
    });

虽然普通循环可能更简单。

对于基本类型的属性,您可以将Objects.equals(a.getPropertyX(), b.getPropertyX())替换为a.getPropertyX() == b.getPropertyX() ...