gpt4 book ai didi

java - 如何使用 Guava 对内存列表/ map 进行过滤/查询

转载 作者:行者123 更新时间:2023-12-04 05:55:56 28 4
gpt4 key购买 nike

我有复杂的对象

    class Person{
Integer id;
String fname;
String lname;
//..... there are more attributes
List<Address> addresses;
}
class Address{
String street1;
String street2;
String city;
String state;
String zip;
}

我有大约 30000 个 Person 对象,每个对象至少有 200-500 个子对象(地址)。现在我在内存中拥有所有这些,并且我有不同的场景(20-30 个场景),我必须根据场景中可用的过滤器查询/过滤对象。例如。
  • scen1 -> 获取所有具有 lname = 'zoik'
  • 的对象
  • scen2 -> 获取所有具有 lname = 'smark' 和 address.street1 = "xyz"的对象
  • scen3 -> 获取所有具有 lname = 'smark' 和 address.street1 = "xyz"和 address.street1 = "pqr"的对象(记住每个对象都有多个地址,所以我需要两个地址都满足上述条件的对象。)
  • scen4 -> 获取所有具有 fname = "smith"和 lname = 'smark' 和 address.city="Los Angeles"的对象
  • .....

  • 简而言之,有多种场景,两种对象的组合不同。
    请建议在这种情况下使用 Guava 的最佳方法?

    最佳答案

    您应该使用 Iterables.filter(Iterable, Predicate)结合 Predicate s。

    例子:

    public class PersonLastNameEqualsPredicate implements Predicate<Person> {
    private String personName;
    public PersonNameEqualsPredicate (String personName) {this.personName= personName;}
    public boolean apply(Person p) { return this.personName.equals(p.getLName()); }
    }

    public class PersonStreet1EqualsPredicate implements Predicate<Person> {
    private String street1Name;
    public PersonStreet1EqualsPredicate (String street1Name) {this.street1Name = street1Name;}
    public boolean apply(Person p) {
    for (Address a: p.getAddresses()) {
    if (street1Name.equals(a.getStreet1()) return true;
    }
    return false;
    }
    }

    // Extra predicates as you need them

    每个场景项需要一个谓词。然后,您需要根据需要调整它们:

    1.
    Predicate<Person> peopleNamedZoik = new PersonLastNamePredicate("zoik");

    2.
    Predicate<Person> peopleNamedSmarkAndLivingInXyzStreet = Predicates.and(new PersonLastNamePredicate("smark"), new PersonStreet1EqualsPredicate("xyz"));

    3.

    在这里,您应该调整您的街道谓词以立即检查所有街道名称是否包含您的所有期望。

    那么这只是一个问题

    1.
    List<Person> myLongPersonList = ...;
    Iterable<Person> zoikPeople = Iterables.filter(myLongPersonList, peopleNamedZoik);

    2.
    List<Person> myLongPersonList = ...;
    Iterable<Person> zoikPeople = Iterables.filter(myLongPersonList, peopleNamedSmarkAndLivingInXyzStreet);

    等等。

    关于java - 如何使用 Guava 对内存列表/ map 进行过滤/查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9520073/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com