优化使用流来检查任何元素是否符合两个条件

问题描述 投票:0回答:2

如何使用 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");
}
java java-8 java-stream
2个回答
0
投票

您可以使用流来

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

然而,虽然这只通过流一次,但一旦匹配了两个角色,它就不会提前退出,因此对于大型数据集来说并不理想。


0
投票

实际上,具有两次

.anyMatch
检查的解决方案更好,因为当所需值匹配时会发生短路,因此这些检查通常可能比整个流上的完整单次运行“更快”完成。 如果缺少
ROLE_OLD
值,则会发生
&&
短路,并且不会执行对
ROLE_NEW
的检查。 最坏的情况是当
ROLE_OLD
位于输入
listOfRelations
的末尾,并且没有
ROLE_NEW
时。

一旦检测到

break
ROLE_OLD
,类似的基于循环的解决方案将使用
ROLE_NEW
;在最坏的情况下,集合会被完全迭代一次。

© www.soinside.com 2019 - 2024. All rights reserved.