根据条件从列表中提取第一个匹配项(Java/Guava)?
我有以下对象的列表:根据条件从列表中提取第一个匹配项(Java/Guava)?,java,functional-programming,guava,Java,Functional Programming,Guava,我有以下对象的列表: class ResourcePermissionDTO { PermissionType permissionType; ... } 其中PermissionType是以下枚举: public enum PermissionType { DENY, READ_ONLY, READ_WRITE; } 因此,列表如下所示: List<ResourcePermissionDTO> myResourcePermissions = ... 列出myR
class ResourcePermissionDTO {
PermissionType permissionType;
...
}
其中PermissionType是以下枚举:
public enum PermissionType {
DENY, READ_ONLY, READ_WRITE;
}
因此,列表如下所示:
List<ResourcePermissionDTO> myResourcePermissions = ...
列出myResourcePermissions=。。。
我想要的是返回在myResourcePermissions中找到的第一个ResourcePermissiond,它具有最严格的权限。目前我有以下内容,但有点混乱,我想可能有更好的方法使用谷歌番石榴/功能性习惯用法
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;
}
}
private resource permissiond以返回在中找到的第一个strestrestrictivepermissions(最终列表resource permissiondto){
if(resourcePermissionDTOs.isEmpty()){
返回null;
}
最终列表resourcePermissionDTOsWithReadWritePermissionOfDeny=Lists.newArrayList();
最终列表ResourcePermissionDTOSWithReadWritePermissionOfRadonly=Lists.newArrayList();
最终列表resourcePermissionDTOsWithReadWritePermissionOfReadWrite=Lists.newArrayList();
对于(最终资源许可证到资源许可证到:资源许可证到){
开关(resourcePermissionDTO.getPermissionType()){
案件驳回:
ResourcePermissiondToWithReadWritePermissionOfDeny.add(resourcePermissionDTO);
打破
案例只读:
ResourcePermissiondToWithReadWritePermissionOfRedonly.add(resourcePermissionDTO);
打破
案例读写:
ResourcePermissiondToWithReadWritePermissionOfReadWrite.add(resourcePermissionDTO);
打破
违约:
打破
}
}
如果(!resourcePermissionDTOsWithReadWritePermissionOfDeny.isEmpty()){
返回resourcePermissionDTOsWithReadWritePermissionOfDeny.get(0);
}如果(!ResourcePermissionDTOSWithReadWritePermissionOfRedonly.isEmpty())为else,则为{
返回ResourcePermissionDTOSWithReadWritePermissionOfRedonly.get(0);
}如果(!resourcePermissionDTOsWithReadWritePermissionOfReadWrite.isEmpty()),则为else{
返回resourcePermissionDTOsWithReadWritePermissionOfReadWrite.get(0);
}否则{
返回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;
我会怎么做
class ResourcePermissiond实现可比较的{
许可类型许可类型;
@凌驾
public int comparieto(资源许可证){
返回this.permissionType.compareTo(that.permissionType);
}
}
列出myResourcePermissions=
ResourcePermissionDTO leastRestrictive=Ordering.natural().max(myResourcePermissions)代码>
谢谢,您将如何实现isStronger方法-为每个枚举分配一个数字(优先级1-4)并进行整数比较?或者其他什么?如果
enum
声明中的常量是按其权限强度排序的,则可以使用内置的compareTo()
方法。否则,您可以指定数字来表示强度。
return permissions.stream().reduce((result, p) -> {
return isStronger(p.getPermissionType(), result.getPermissionType()) ? p : result;
}).orElse(null);
class ResourcePermissionDTO implements Comparable<ResourcePermissionDTO> {
PermissionType permissionType;
@Override
public int compareTo(ResourcePermissionDTO that) {
return this.permissionType.compareTo(that.permissionType);
}
}