早上好.目前,我有以下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;
}

目前,我有一个身份列表(100),我需要在该列表中搜索其部分或全部参数,即,我可以使用以下用例在列表中搜索身份:

 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,如果定义了服务,它也将判断服务,最后如果定义了角色,它将按角色搜索.

注:您可以使用乘数if elses或乘数methods来简化isCorrectIdentity.

Java相关问答推荐

我可以在regex中的字符类中放置断言吗?

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

缩小画布比例后更改滚动窗格的内部大小

条件加载@ManyToMany JPA

对某一Hyroby控制器禁用@cacheable

有没有办法让扩展变得多态?

通过移动一个类解决了潜在的StubbingProblem.它怎麽工作?

匹配一组字符或另一组字符

Java连接池无法正常工作

如何在Jooq中获取临时表列引用?

寻找Thread.sky()方法的清晰度

没有Tomcat,IntelliJ如何在本地运行API?

循环不起作用只有第一个元素重复

协同 routine 似乎并不比JVM线程占用更少的资源

谷歌应用引擎本地服务器赢得';t在eclipse上运行

为什么Java编译器为没有参数的方法(getter方法)创建桥接方法

关于正则表达式的一个特定问题,该问题与固定宽度负向后看有关

Jackson YAML:支持锚点扩展/覆盖

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?