Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java流中只查找和匹配一个元素列表?_Java_Java 8_Java Stream - Fatal编程技术网

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

如何在java流中只查找和匹配一个元素列表?,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个列表,其中包含一些家庭号码,它们有“isPrimary”和“number”属性 "homeNumbers": [ { "isPrimary": true, "number": "9999999999" }, { "isPrimary": false, "number": "9999999323" } ] 现在,我想在列表上写两个条件,只匹配其中一个,我的意思是这个列表

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

您可以先按primary numbers进行筛选,然后再次筛选非空数字,然后计数并与1进行比较,如下所示:

boolean isValid(List<HomeNumber> numbers) {
    return numbers.stream()
                  .filter(HomeNumber::isPrimary)
                  .filter(n -> Objects.notNull(n.getNumber()))
                  .count() == 1;
}
布尔值有效(列表编号){
返回数字。stream()
.filter(HomeNumber::iPrimary)
.filter(n->Objects.notNull(n.getNumber())
.count()==1;
}

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

private boolean isSetPrimaryHomeNumberAndUnique(UpdateWorkerDto updateWorkerDto) {
        return updateWorkerDto.getPhoneNumbers().getHomeNumbers().stream()
                .filter(HomeNumber::isPrimary)
                .filter(number -> number.getNumber()!=null)
                .count() == 1;
}
私有布尔值isSetPrimaryHomeNumber(UpdateWorkerTo UpdateWorkerTo){
谓词isPrimaryHome=HomeNumber::isPrimary;
谓词isHomeNumberNotNull=homeNumber->Objects.nonNull(homeNumber.getNumber());
返回updateWorkerDto.getPhoneNumbers().getHomeNumbers().stream()
.filter(isPrimaryHome.and(IsHomeNumber NotNull))
.findFirst().orElse(null)!=null;

}

单一责任原则要求将这些检查分开。开销看起来很大,但实际上几乎无法测量。@Nicktar是的,你是对的,我同意你的看法。谢谢
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;