具有任何匹配属性的对象的JAVA 8筛选器列表

具有任何匹配属性的对象的JAVA 8筛选器列表,java,oop,arraylist,java-8,java-stream,Java,Oop,Arraylist,Java 8,Java Stream,我的要求是通过匹配任何属性的字符串筛选对象列表。 例如,假设Contact类有三个属性:street、city、phone 我知道java流过滤器是如何工作的,我必须将输入字符串与每个属性进行比较,如下所示: contactList.stream().filter(contact -> contact.getStreet().equals("dubai") || contact.getCity().equals("dubai") |

我的要求是通过匹配任何属性的字符串筛选对象列表。 例如,假设
Contact
类有三个属性:street、city、phone

我知道java流过滤器是如何工作的,我必须将输入字符串与每个属性进行比较,如下所示:

contactList.stream().filter(contact -> contact.getStreet().equals("dubai") || 
                            contact.getCity().equals("dubai") || .......).collect(Collectors.toList());
contactList.stream().filter(contact -> contact.anyProperty.equals("dubai").collect(Collectors.toList());
但是,如果一个类有20多个属性且大小为列表80000+,则将每个属性与输入字符串进行比较会影响性能。所以我的问题是,Java或任何其他库是否支持过滤具有任何匹配属性的列表?如下所示:

contactList.stream().filter(contact -> contact.getStreet().equals("dubai") || 
                            contact.getCity().equals("dubai") || .......).collect(Collectors.toList());
contactList.stream().filter(contact -> contact.anyProperty.equals("dubai").collect(Collectors.toList());

有人能帮我吗,谢谢。

你可以使用
findAny
。这将在找到候选人后立即结束:

Optional<Contact> contact = contactList.stream().filter(contact -> contact.getStreet().equals("dubai") || 
                        contact.getCity().equals("dubai") || .......).findAny();

您可以通过使用反射读取所有类属性来解决此问题


通过重写toString()方法并检查to String的结果是否包含输入字符串,一种可能的方法是使用必需的属性重写toString(),并使用它检查它是否包含单词

contactList.stream()
    .filter(contact -> contact.toString().contains("dubai"))
    .collect(Collectors.toList());

您可能还想使用
模式来匹配确切的单词。

我有一个使用Gson和JSON的项目,当我阅读您的问题时,我想到的第一件事是:

  • 将列表转换为JsonObject的JsonArray=>您可以轻松获得每个JsonObject的键集(联系人对象的属性列表)
  • 在该列表中筛选,找到所有值为“dubai”的JsonObject

  • 我想,你的问题已经解决了

    contactList.stream().anyMatch(contact -> contactMacther(contact,"dubai"));
    private boolean contactMacther(Contact contact, String match){
        return contact.getStreet().equalsIgnoreCase(match) ||
                contact.getCity().equalsIgnoreCase(match);
    

    您可以创建提取属性的函数列表,然后在筛选方法中使用它:

    List getPrperties=Arrays.asList(
    联系人:getStreet,
    联系人:getCity
    //其他
    );
    contactList.stream()
    .filter(contact->getPrperties.stream()
    .map(f->f.apply(联系))
    .anyMatch(“迪拜”::等于)
    )
    .collect(收集器.toList();
    
    或者您可以提取测试方法:

    BiFunction<Contact, String, Boolean> test = (contact, values) ->
            getPrperties.stream().map(f -> f.apply(contact)).anyMatch(values::equals);
    
    List<Person> collect = contactList.stream()
            .filter(contact -> test.apply(contact, "dubai"))
            .collect(Collectors.toList());
    
    双功能测试=(触点,值)->
    getPrperties.stream().map(f->f.apply(contact)).anyMatch(value::equals);
    List collect=contactList.stream()
    .filter(联系->测试.apply(联系“迪拜”))
    .collect(Collectors.toList());
    
    似乎您需要在数据库中进行全文搜索。您是否考虑/调查过这一点?没有库可以消除任务所需的基本操作。如果您希望检查所有属性,则需要检查所有属性。任何外观更好的解决方案都只会隐藏实际工作。您能否分享如何筛选Jsonoobjects,并获取过滤对象的ID转换为json文本:
    String json=new Gson().toJson(yourList);
    转换为json数组:
    JsonArray arr=new JsonParser().parse(json).getAsJsonArray();
    JsonArray是一个Iterable,它的元素是jsoneElement,可以通过
    .getAsJsonObject()转换为JsonObject
    而JsonObject有“entrySet()`自己尝试使用它们谢谢,我会尝试这个。谢谢,toString()将是一个简单的技巧,我会检查性能。显然,将20+属性连接到一个字符串来搜索它,不仅仅是比较20+属性。