通过某些字段在java列表中搜索值

问题描述 投票:0回答:2

早上好。目前我有以下 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 的方法,但我不知道它们是否适用于我想要的部分搜索,我想要的是,如果匹配,则返回元素

java list search arraylist
2个回答
0
投票

如果我理解你的问题,你需要这样的东西:

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,如果定义了服务,它还会检查服务,最后如果定义了角色,它将按角色搜索。


0
投票

您可以使用 Java Stream API 来实现此目的。

例如,给定

List
Identity
称为
identities
,您可以执行以下操作:

identities.stream()
  .filter(identity -> identity.getType().Equals(type) && identity.getId().Equals(id))
© www.soinside.com 2019 - 2024. All rights reserved.