具有任何匹配属性的对象的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+属性。