繁体   English   中英

如何在返回 boolean 值的方法上使用 stream

[英]How to use stream on method that return boolean value with condition

我正在使用这种方法:

public boolean checkRowsFilterNameBy(String filter){
    waitForElmContainsText(searchButton, "Search");
    List<AuditRow> listRows = auditTable.getTable();
    for(AuditRow row : listRows){
        if(!row.nameStr.equals(filter)||!row.nameStr.contains(filter))
            return false;
    }
    return true;
}

我希望能够使用 Stream 对其进行更改,我尝试了以下方法,但我遗漏了一些东西:

listRows.stream().forEach(auditRow -> {
           if(auditRow.actionStr.equals(filter))return true;} else return false;);

但我收到一个错误。

你可以这样做,

listRows.stream().allMatch(row -> row.nameStr.equals(filter) && row.nameStr.contains(filter));

更新

根据霍尔格斯的建议,这可以进一步简化。

listRows.stream().allMatch(row -> row.nameStr.contains(filter));

equalscontains的使用可能因您的具体情况而异。

我会使用流过滤器来过滤掉所有真实的元素并对结果进行计数。

boolean result = (listRows.stream().filter(row -> row.nameStr.equals(filter) && row.nameStr.contains(filter)).count() == 0);

使用de-morgan定律去除所有的否定

(!a || !b) => !(a && b)

你可以使用allMatch作为:

return listRows.stream()
        .allMatch(row -> row.nameStr.equals(filter)
                && row.nameStr.contains(filter));

其中有一个使用noneMatch的类似版本:

return listRows.stream()
        .noneMatch(row -> (!row.nameStr.equals(filter) 
                || !row.nameStr.contains(filter)));

你的代码的逻辑改进可能还需要检查contains哪些意味着equal ,这将减少到:

return listRows.stream().allMatch(row -> row.nameStr.contains(filter));

如果有任何条件成立,这对我有用

return listRows.stream().anyMatch(row -> !row.nameStr.equals(filter) || !row.nameStr.contains(filter)) // boolean;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM