我有一个包含Company对象的列表。List<Company> companiesList
每个公司都有一个getName()
方法来返回公司名称。List<Company> companiesList
内部有几家公司,我想将此列表与包含公司名称的字符串列表进行比较
这是我的比较清单List<String> searchList = Arrays.asList("abc", "xyz");
我有我的方法来获取公司和流,并使用DB中的某些条件对其进行过滤,我想添加另一个过滤器,该过滤器返回与searchList中的字符串相等的公司
因此,基本上的想法是将CompaniesList中的每个元素与getName()进行比较,并检查该元素是否存在于searchList列表中
public List<Company> getCompanies(String country, List<String> searchList, String version) {
List<Company> result = countriesByCountryCache.getUnchecked(country)
.stream()
.filter(s -> version.compareTo(s.getVersion()) >= 0)
//here to filter like for each element, i want to compare element.getName() and check if it exists in searchList and collect it
.collect(Collectors.toList());
return result;
}
我知道它已经被问过很多次了,有很多例子,但是我找不到合适的,正确的解决方案。提前致谢!
最佳答案
您可以在.filter()
中添加另一个条件,以仅在过滤版本后返回searchList
中存在的结果。
将searchList
转换为HashSet会更好一些,因为这将降低从O(n)
到O(1)
的搜索公司的复杂性,并且还将注意删除可能具有的所有重复值。
最好传入HashSet而不是列表(如果您可以控制界面设计)。
这是我首先将searchList
转换为集合,然后在.filter()
中添加新条件以仅返回searchList
中存在的公司的代码段。
public List<Company> getCompanies(String country, List<String> searchList, String version) {
// Convert the given search list to a set
final Set<String> searchQueries = new HashSet<>(searchList);
List<Company> result = countriesByCountryCache.getUnchecked(country)
.stream()
.filter(s -> version.compareTo(s.getVersion()) >= 0 && searchQueries.contains(s.getName()))
.collect(Collectors.toList());
return result;
}