![](/img/trans.png)
[英]How to use stream on method that return boolean value with multiple condition
[英]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));
equals
或contains
的使用可能因您的具体情况而异。
我会使用流过滤器来过滤掉所有真实的元素并对结果进行计数。
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.