Java 如何按属性查询inmemory对象?
我得到了一个300个json对象的列表,这些对象将在内存中缓存一天。在应用程序的执行过程中,我希望根据对象的属性查询对象 例如:Java 如何按属性查询inmemory对象?,java,Java,我得到了一个300个json对象的列表,这些对象将在内存中缓存一天。在应用程序的执行过程中,我希望根据对象的属性查询对象 例如: @XmlRootElement(name = "persons") @XmlAccessorType(XmlAccessType.FIELD) class PersonsDTO { private List<PersonDTO> persons; public static class PersonDTO { privat
@XmlRootElement(name = "persons")
@XmlAccessorType(XmlAccessType.FIELD)
class PersonsDTO {
private List<PersonDTO> persons;
public static class PersonDTO {
private String name;
private int age;
//lots of more attributes
private Address address;
}
}
问题:我如何才能最好地为那些“查询”查找准备数据?为每个查询函数创建一个HashMap
,这样我就可以返回预先计算的结果了
或者我可以使用内存系统中的“类似数据库”并且可以像真实数据库一样进行查询吗?您可以使用基于SQL的内存数据库,例如或。 您可以使用基于NoSQL的内存数据库,例如或。 您可以使用支持以下查询的缓存解决方案 但是300个物体很小。您可以在它们上面循环,并将它们放入数组中,如果确实需要的话,只添加基于地图的索引(即对其执行大量查询) 这一切归结为:
在Java8中,您可以使用流来完成这个简单的任务。当然,您需要评估它是否适合您的目的,但这是一种非常快速而简单的实现方法,无需设置本地数据库
public List<PersonDTO> findByAgeBetween(min, max){
List<PersonDTO> byAge =
personList.stream().
filter(p -> p.age >= min).
filter(p -> p.age <= max).
collect(Collectors.toList());
return byAge;
}
public List findByAgeBetween(最小值、最大值){
按年龄列出=
personList.stream()。
过滤器(p->p.age>=min)。
过滤器(p->p.age除非您有特定的性能要求,否则我将强制执行它。扫描300个条目的时间应少于0.1毫秒
这将允许您使用内置的streams API
private List<PersonDTO> persons;
public List<PersonDTO> findBy(Predicate<PersionDTO> test) {
return persons.stream().filter(test).collect(Collectors.toList());
}
// findByName
List<PersonDTO> david = findBy(p -> p.getName().startsWith("David "));
// find by age
List<PersonDTO> youngAdult= findBy(p -> p.getAge() >= 18 && p.getAge() <= 30);
个人名单;
公共列表findBy(谓词测试){
return persons.stream().filter(test).collect(collector.toList());
}
//findByName
List david=findBy(p->p.getName().startsWith(“david”);
//按年龄查找
列出youngmaintal=findBy(p->p.getAge()>=18&&p.getAge()执行此类查询的频率?
private List<PersonDTO> persons;
public List<PersonDTO> findBy(Predicate<PersionDTO> test) {
return persons.stream().filter(test).collect(Collectors.toList());
}
// findByName
List<PersonDTO> david = findBy(p -> p.getName().startsWith("David "));
// find by age
List<PersonDTO> youngAdult= findBy(p -> p.getAge() >= 18 && p.getAge() <= 30);