Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据条件从列表中提取第一个匹配项(Java/Guava)?_Java_Functional Programming_Guava - Fatal编程技术网

根据条件从列表中提取第一个匹配项(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;
我会怎么做

  • 使ResourcePermissiond实现
  • class ResourcePermissiond实现可比较的{
    许可类型许可类型;
    @凌驾
    public int comparieto(资源许可证){
    返回this.permissionType.compareTo(that.permissionType);
    }
    }
    
  • 将所有DTO添加到单个列表中

    列出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);
          }
        }