如何在Java流中仅查找和匹配一个元素列表?

时间:2020-03-03 08:32:30

标签: java java-8 java-stream

我有一个包含一些家庭电话号码的列表,它们具有'isPrimary'和'number'属性。

"homeNumbers": [
      {
        "isPrimary": true,
        "number": "9999999999"
      },
      {
        "isPrimary": false,
        "number": "9999999323"
      }
    ]

现在,我想在列表上写两个条件以仅匹配其中一个,我的意思是此列表必须具有一个主数,并且其编号不能为空。

我已经写了下面的代码,但是它只是检查是否有任何主数,现在,我想知道如何扩展它以检查其中只有一个是主数。

private boolean isSetPrimaryHomeNumber(UpdateWorkerDto updateWorkerDto) {
    return updateWorkerDto.getPhoneNumbers().getHomeNumbers().stream().anyMatch(
            number -> Objects.requireNonNullElse(number.getIsPrimary(), false) && !number.getNumber().isEmpty());
}

3 个答案:

答案 0 :(得分:5)

您可以先按主数过滤,然后再对非空数进行过滤,然后像这样计数并与1进行比较:

boolean isValid(List<HomeNumber> numbers) {
    return numbers.stream()
                  .filter(HomeNumber::isPrimary)
                  .filter(n -> Objects.notNull(n.getNumber()))
                  .count() == 1;
}

答案 1 :(得分:0)

您可以尝试将您的方法修改为以下内容:

private boolean isSetPrimaryHomeNumberAndUnique(UpdateWorkerDto updateWorkerDto) {
        return updateWorkerDto.getPhoneNumbers().getHomeNumbers().stream()
                .filter(HomeNumber::isPrimary)
                .filter(number -> number.getNumber()!=null)
                .count() == 1;
}

答案 2 :(得分:0)

private boolean isSetPrimaryHomeNumber(UpdateWorkerDto updateWorkerDto) {

    Predicate<HomeNumber> isPrimaryHome = HomeNumber::isPrimary;
    Predicate<HomeNumber> isHomeNumberNotNull = homeNumber -> Objects.nonNull(homeNumber.getNumber());

    return updateWorkerDto.getPhoneNumbers().getHomeNumbers().stream()
            .filter(isPrimaryHome.and(isHomeNumberNotNull))
            .findFirst().orElse(null) != null;

}