我有一个包含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;
}

10-06 05:43