如何在返回带条件的布尔值的方法上使用流

时间:2019-02-19 17:04:27

标签: java list java-stream conditional-statements

我正在使用这种方法:

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;);

但是我遇到了错误。

3 个答案:

答案 0 :(得分:1)

您可以这样做

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

更新

按照Holgers的建议,这可以进一步简化。

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

根据您的上下文,equalscontains的使用可能会有所不同。

答案 1 :(得分:0)

我将使用流过滤器过滤掉所有为真的元素,并对结果进行计数。

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

答案 2 :(得分:0)

使用德摩根定律消除所有的否定,例如

(!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));