Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按属性查询inmemory对象?_Java - Fatal编程技术网

Java 如何按属性查询inmemory对象?

Java 如何按属性查询inmemory对象?,java,Java,我得到了一个300个json对象的列表,这些对象将在内存中缓存一天。在应用程序的执行过程中,我希望根据对象的属性查询对象 例如: @XmlRootElement(name = "persons") @XmlAccessorType(XmlAccessType.FIELD) class PersonsDTO { private List<PersonDTO> persons; public static class PersonDTO { privat

我得到了一个300个json对象的列表,这些对象将在内存中缓存一天。在应用程序的执行过程中,我希望根据对象的属性查询对象

例如:

@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个物体很小。您可以在它们上面循环,并将它们放入数组中,如果确实需要的话,只添加基于地图的索引(即对其执行大量查询)

这一切归结为:

  • 您多长时间查询一次此数据集
  • 这些查询是固定的(我想要Joe Blake)、带参数的固定查询(我想要每个人都叫X)还是自由形式的
  • 如果您很少去查询数据集,并且查询是固定的/固定的,那么我只需在数据集上循环(Java8StreamsAPI;最简单的解决方案)。 如果您需要频繁地访问数据集,但查询是固定的,那么我会预先计算结果。 如果您需要使用少量带有参数的固定查询来大量访问数据集,我会考虑添加一些自制索引(哈希映射)。 如果您需要自由形式的查询,我会考虑使用内存中的数据库(NoSQL或SQL)或Java 8 Streams API。

    是用Java编写的内存中SQL数据库

    否则,您将需要设计和构建自己的引擎。您可能有专用的方法名,如您所示,这避免了一些查询解析方面,但您仍然需要实现查询本身,包括如何定义匹配(精确、部分、区分大小写等)。

    300不是一个很大的数字(尽管斯巴达人和波斯人可能会对此提出异议……)

  • 因此,在一个简单的解决方案中,您只需将对象保存在一个列表中,然后在列表中迭代,并使用所需的属性对对象进行优化。这是非常低效的,但300它将工作得很好

  • 如果您使用Java8,则可以使用并行 流式处理和过滤,这将利用您的处理器资源 以最好的方式。效率仍然不高

  • 还有一个想法- 为每个对象添加或生成唯一的id,并创建主映射 将您的id添加到您的DTO。然后为每种类型创建单独的贴图 要通过其进行搜索的属性。每个映射都应该包含属性 值添加到具有该值的DTO的ID列表中。然后你问 属性映射以查找ID,然后将主映射搜索到 查找DTO。一般来说,这是一个经典的权衡 性能和空间


  • 在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);