首页 > 解决方案 > 如何在 java 流中仅查找和匹配一个元素列表?

问题描述

我有一个包含一些家庭号码的列表,它们具有“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());
}

标签: javajava-8java-stream

解决方案


您可以先按主要数字过滤,然后再次过滤非空数字,然后计数并与 1 进行比较,如下所示:

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

推荐阅读