如何使用 Java 8 中的流来优化以下代码? 使用
anyMatch
两次不是重点。
boolean isRoleOld,isRoleNew;
for (Relations relation : listOfRelations)
{
if (Constants.ROLE_OLD.equalsIgnoreCase(relation.getRole()))
{
isRoleOld = true;
}
if (Constants.ROLE_NEW.equalsIgnoreCase(relation.getRole()))
{
isRoleNew = true;
}
}
if (isRoleOld && isRoleNew)
{
"Success"
}else{
throw Exception();
}
到目前为止我所做的是:
if (listOfRelations.stream()
.anyMatch(relation -> Constants.ROLE_OLD.equalsIgnoreCase(relation.getRole()))
&&
listOfRelations.stream()
.anyMatch(relation -> Constants.ROLE_NEW.equalsIgnoreCase(relation.getRole())))
{
System.out.println("Success");
}
您可以使用流来
map
到每个角色,并 filter
来识别旧/新角色匹配,然后计算不同的匹配。
long count = listOfRelations.stream().map(Relations::getRole)
.filter(role -> Constants.ROLE_OLD.equalsIgnoreCase(role)
|| Constants.ROLE_NEW.equalsIgnoreCase(role))
.map(String::toLowerCase)
.distinct().count();
if (count != 2) {
throw new Exception();
}
System.out.println("Success");
然而,虽然这只通过流一次,但一旦匹配了两个角色,它就不会提前退出,因此对于大型数据集来说并不理想。
实际上,具有两次
.anyMatch
检查的解决方案更好,因为当所需值匹配时会发生短路,因此这些检查通常可能比整个流上的完整单次运行“更快”完成。 如果缺少 ROLE_OLD
值,则会发生 &&
短路,并且不会执行对 ROLE_NEW
的检查。 最坏的情况是当 ROLE_OLD
位于输入 listOfRelations
的末尾,并且没有 ROLE_NEW
时。
一旦检测到
break
和 ROLE_OLD
,类似的基于循环的解决方案将使用 ROLE_NEW
;在最坏的情况下,集合会被完全迭代一次。