我有以下对象的列表:
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] 删除。
我来说两句