我正在使用这种方法:
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;);
但是我遇到了错误。
答案 0 :(得分:1)
您可以这样做
listRows.stream().allMatch(row -> row.nameStr.equals(filter) && row.nameStr.contains(filter));
更新
按照Holgers的建议,这可以进一步简化。
listRows.stream().allMatch(row -> row.nameStr.contains(filter));
根据您的上下文,equals
或contains
的使用可能会有所不同。
答案 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));