早上好。目前我有以下 java 类,其中有一个身份列表:
@Getter
@AllArgsConstructor
@RegisterForReflection
@NoArgsConstructor
@Setter
public class Identity {
private String type;
private String id;
@JsonIgnore
private String account;
private List<String> services;
private List<String> roles;
}
目前我有一个身份列表(
List <Identity>
),我需要在此列表中搜索其部分或全部参数,也就是说,我可以使用以下用例在列表中搜索身份:
1. type && id;
2. type && id && services;
3. type && id && services && roles;
遇到这种情况我该怎么办?我知道列表有类似 contains 的方法,但我不知道它们是否适用于我想要的部分搜索,我想要的是,如果匹配,则返回元素
如果我理解你的问题,你需要这样的东西:
public Identity findIdentity(List<Identity> identities, String type, String id, List<String> services, List<String> roles) {
return identities.stream()
.filter(identity -> isCorrectIdentity(type, id, services, roles, identity))
.findFirst()
.orElse(null);
}
private boolean isCorrectIdentity(String type, String id, List<String> services, List<String> roles, Identity identity) {
return identity.getType().equals(type) && identity.getId().equals(id) &&
(services == null || new HashSet<>(identity.getServices()).containsAll(services)) &&
(roles == null || new HashSet<>(identity.getRoles()).containsAll(roles));
}
这将循环遍历您的列表,逐个元素检查类型和 ID,如果定义了服务,它还会检查服务,最后如果定义了角色,它将按角色搜索。
您可以使用 Java Stream API 来实现此目的。
例如,给定
List
的 Identity
称为 identities
,您可以执行以下操作:
identities.stream()
.filter(identity -> identity.getType().Equals(type) && identity.getId().Equals(id))