根据条件(Java / Guava)从列表中提取第一个匹配项?

25

我有以下对象的列表:

class ResourcePermissionDTO {
  PermissionType permissionType;
  ... 
}

其中PermissionType是以下枚举:

public enum PermissionType {
   DENY, READ_ONLY, READ_WRITE;
}

因此,列表如下所示:

List<ResourcePermissionDTO> myResourcePermissions = ...

我想要的是返回在myResourcePermissions中找到的第一个ResourcePermissionDTO,它具有最严格的权限。目前,我有以下内容,但有点混乱,尽管使用Google Guava /功能性习语可能有更好的方法?

private ResourcePermissionDTO returnTheFirstMostRestrictivePermissionFoundIn(final List<ResourcePermissionDTO> resourcePermissionDTOs) {
    if (resourcePermissionDTOs.isEmpty()) {
      return null;
    }

    final List<ResourcePermissionDTO> resourcePermissionDTOsWithReadWritePermissionOfDeny = Lists.newArrayList();
    final List<ResourcePermissionDTO> resourcePermissionDTOsWithReadWritePermissionOfReadOnly = Lists.newArrayList();
    final List<ResourcePermissionDTO> resourcePermissionDTOsWithReadWritePermissionOfReadWrite = Lists.newArrayList();

    for (final ResourcePermissionDTO resourcePermissionDTO : resourcePermissionDTOs) {
      switch (resourcePermissionDTO.getPermissionType()) {
      case DENY:
        resourcePermissionDTOsWithReadWritePermissionOfDeny.add(resourcePermissionDTO);
        break;
      case READ_ONLY:
        resourcePermissionDTOsWithReadWritePermissionOfReadOnly.add(resourcePermissionDTO);
        break;
      case READ_WRITE:
        resourcePermissionDTOsWithReadWritePermissionOfReadWrite.add(resourcePermissionDTO);
        break;
      default:
        break;
      }
    }

    if (!resourcePermissionDTOsWithReadWritePermissionOfDeny.isEmpty()) {
      return resourcePermissionDTOsWithReadWritePermissionOfDeny.get(0);
    } else if (!resourcePermissionDTOsWithReadWritePermissionOfReadOnly.isEmpty()) {
      return resourcePermissionDTOsWithReadWritePermissionOfReadOnly.get(0);
    } else if (!resourcePermissionDTOsWithReadWritePermissionOfReadWrite.isEmpty()) {
      return resourcePermissionDTOsWithReadWritePermissionOfReadWrite.get(0);
    } else {
      return null;
    }
  }
轴突

即使是命令式的,也可以将其简化如下:

List<ResourcePermissionDTO> permissions = ...;
ResourcePermissionDTO result = null;

for (ResourcePermissionDTO p: permissions) {
    if (result == null || isStronger(p.getPermissionType(), result.getPermissionType())) {
        result = p;
        if (result.getPermissionType() == PermissionType.DENY) break; // (1)
    }
}

return result;

如果您更喜欢功能样式,则可以使用进行完全相同的复制(尽管没有进行短路优化(1)reduce()Guava不支持reduce(),因此以下示例在Java 8中:

return permissions.stream().reduce((result, p) -> {
    return isStronger(p.getPermissionType(), result.getPermissionType()) ? p : result;
}).orElse(null);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据关键字提取字符串的第一个匹配项

Java 8从Map中的匹配值中提取第一个键

根据字符串中的第一个字符,找到字符串列表中元素的第一个匹配项

按数据框进行分组和排序,然后根据条件找到第一个匹配项

如何根据列值从数据序列中提取第一个和最后一个值?

根据列规则选择第一个匹配项

根据列合并数据帧,仅保留第一个匹配项

通过给定变量查找条件的第一个匹配项

SQL条件字段,第一个匹配项JOIN

MySQL仅获取3列之间的条件的第一个匹配项

在条件的第一个匹配项上执行查找的公式

如何转换for循环以查找Java流中的第一个匹配项?

使用Regex和Java查找第一个匹配项

Java .split-删除第一个匹配项

返回Java 8流中的第一个匹配项(类似于_.find)

如何提取满足矩阵列表中条件的第一个观察结果?

创建数据框,根据列表的第一个元素进行匹配

如何根据数组(和找到的节点)中的第一个匹配项查询第一个节点?

更新列表以保留第一个匹配条件并删除后续项目

在列表中查找第一个元素和索引匹配条件

如何在列表中找到匹配条件的第一个元素?

根据另一个列表按属性删除第一个匹配的对象

等待的第一个任务在阵列匹配的条件的

根据第一个元素组合嵌套列表

根据第一个元素合并列表

从Java中的字符串中提取第一个单词的最佳方法是什么?

删除列表中的重复项,但不应根据计数删除第一个首选项

根据另一个数据框给出的匹配值从大列表中提取数据框

获取匹配某些条件的列表的第一个值,然后在python中将后验值设置为零