Java 地图中过滤值的优化方法

Java 地图中过滤值的优化方法,java,collections,hashmap,Java,Collections,Hashmap,我有一个地图,它具有与用户相关联的属性,例如 user : {name=tom, address=usa, id=111, contact=7869989556, designation=engineer} 我将有一个规则列表,根据给定的键和值列表阻止垃圾用户。e、 g不允许名称以test开头的工程师。 所以我的标准是如果name=^test.*$和designation=engineer阻止添加到DB。 上述规则将来也可以扩展到其他键,也可以扩展到值列表。e、 g.规则可扩展为力学等 在j

我有一个地图,它具有与用户相关联的属性,例如

user : {name=tom, address=usa, id=111, contact=7869989556, 
designation=engineer}
我将有一个规则列表,根据给定的键和值列表阻止垃圾用户。e、 g不允许名称以test开头的工程师。 所以我的标准是如果name=^test.*$和designation=engineer阻止添加到DB。 上述规则将来也可以扩展到其他键,也可以扩展到值列表。e、 g.规则可扩展为力学等

在java中实现这一点的最佳方法是什么

编辑:


为了在将来允许扩展,一种实现它的好方法是使用
谓词的集合。因此,您只需向列表中添加更多谓词

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class MapFilter {

    public static void main(String[] args) {
        User tomTheEngineer = new User("111", "tom", "usa", "7869989556", "engineer");
        User martinTheManager = new User("112", "tom", "india", "234234", "manager");
        User billTheTester = new User("113", "billTest", "spain", "23423423", "tester");

        List<User> users = Arrays.asList(tomTheEngineer, martinTheManager, billTheTester);

        List<Predicate<User>> allPredicates = new ArrayList<>();
        allPredicates.add(user -> !user.name.endsWith("Test"));
        allPredicates.add(user -> !user.designation.equals("engineer"));

        List<User> filteredUsers = users.stream()
                .filter(allPredicates.stream().reduce(x -> true, Predicate::and))
                .collect(Collectors.toList());
        assert(filteredUsers.size() == 1 && filteredUsers.contains(martinTheManager));
    }

    static class User {
        String id;
        String name;
        String address;
        String contact;
        String designation;

        public User(String id, String name, String address, String contact, String designation) {
            this.id = id;
            this.name = name;
            this.address = address;
            this.contact = contact;
            this.designation = designation;
        }
    }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.function.Predicate;
导入java.util.stream.collector;
公共类映射过滤器{
公共静态void main(字符串[]args){
用户tomTheEngineer=新用户(“111”、“tom”、“usa”、“7869989556”、“engineer”);
用户martinTheManager=新用户(“112”、“tom”、“india”、“234234”、“manager”);
用户billTheTester=新用户(“113”、“billTest”、“西班牙”、“23423423”、“测试仪”);
List users=Arrays.asList(工程师、Martin经理、billTheTester);
List allPredicates=new ArrayList();
allPredicates.add(user->!user.name.endsWith(“Test”);
allPredicates.add(user->!user.designation.equals(“工程师”);
List filteredUsers=users.stream()
.filter(allPredicates.stream().reduce(x->true,谓词::and))
.collect(Collectors.toList());
断言(filteredUsers.size()==1&&filteredUsers.contains(martinTheManager));
}
静态类用户{
字符串id;
字符串名;
字符串地址;
弦接触;
字符串名称;
公共用户(字符串id、字符串名称、字符串地址、字符串联系人、字符串名称){
this.id=id;
this.name=名称;
this.address=地址;
this.contact=contact;
这个名称=名称;
}
}
}

注:我不明白你为什么需要一张地图,所以我列了一张清单。请随意更改更适合您的问题的数据结构。

可能是带过滤器的流?用Java发布您的数据结构,我的意思是我有一个
Map
而不是一个Map。。。
用户的样子如何?您可以使用
User
的方法进行过滤和许多其他选项。当您谈论优化时,您想要优化什么?计算还是记忆?因为一种可能的方法是创建自己的地图,复制数据,以达到最佳的记忆惩罚时间。Reed with deHaar:使用流过滤器可能是最快的方法。@deHaar我用代码和更多细节编辑了这个问题。
doNotAddUserCriteria.put("name", ['^9999.*$','^7777.*$'])
doNotAddUserCriteria.put("designation", ['enginner'])

if(isValidUser(userData)){
    Process if valid else drop
}   

public boolean isValidUser(Map<String,Object> userData) {

    Logic should be applied here to check whether user is valid based on criteria
} 
doNotAddUserCriteria.put("name", ['^9999.*$','^7777.*$'])
doNotAddUserCriteria.put("designation", ['enginner','mechanic']) 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class MapFilter {

    public static void main(String[] args) {
        User tomTheEngineer = new User("111", "tom", "usa", "7869989556", "engineer");
        User martinTheManager = new User("112", "tom", "india", "234234", "manager");
        User billTheTester = new User("113", "billTest", "spain", "23423423", "tester");

        List<User> users = Arrays.asList(tomTheEngineer, martinTheManager, billTheTester);

        List<Predicate<User>> allPredicates = new ArrayList<>();
        allPredicates.add(user -> !user.name.endsWith("Test"));
        allPredicates.add(user -> !user.designation.equals("engineer"));

        List<User> filteredUsers = users.stream()
                .filter(allPredicates.stream().reduce(x -> true, Predicate::and))
                .collect(Collectors.toList());
        assert(filteredUsers.size() == 1 && filteredUsers.contains(martinTheManager));
    }

    static class User {
        String id;
        String name;
        String address;
        String contact;
        String designation;

        public User(String id, String name, String address, String contact, String designation) {
            this.id = id;
            this.name = name;
            this.address = address;
            this.contact = contact;
            this.designation = designation;
        }
    }
}