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

问题描述 投票:0回答:6

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。

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

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

但是,如果一个类具有20多个属性,并且列表的大小超过80,000+,则将每个属性与输入字符串进行比较会影响性能。所以我的问题是,Java或任何其他库是否支持使用任何匹配属性过滤列表?如下所示:

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

有人可以帮我吗,谢谢。

java java-8 java-stream
6个回答
4
投票

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

通过重写toString()方法,并检查to String的结果是否包含输入字符串


2
投票

一种可能的方法是使用必需的属性覆盖toString()并使用它来检查它是否包含单词,

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

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


1
投票

您可以使用findAny。一旦找到候选人,这将结束:

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

或者如果仅在存在此类对象的情况下仅需要信息,请使用anyMatch

boolean exists = contactList.stream().anyMatch(contact -> contact.getStreet().equals("dubai") || 
                        contact.getCity().equals("dubai") || .......);

0
投票

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

  1. 将列表转换为JsonObject的JsonArray =>您可以轻松获取每个JsonObject的键集(联系人对象的属性列表)
  2. 在该列表中过滤,找到所有具有值“ dubai”的JsonObject

0
投票

我想,代码阻止了您的问题已解决。

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

0
投票

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

List<Function<Contact, Object>> getPrperties = Arrays.asList(
        Contact::getStreet, 
        Contact::getCity
        // other
        );

contactList.stream()
        .filter(contact -> getPrperties.stream()
                .map(f -> f.apply(contact))
                .anyMatch("dubai"::equals)
        )
        .collect(Collectors.toList();
© www.soinside.com 2019 - 2024. All rights reserved.