使用流检查一个列表中的值是否存在于另一个列表中

Check if value from one list is present in another list using stream

我有 List<RegionCountry> regionCountries 个:

class RegionCountry {
    Region region;
    List<Country> countries;
   }

地区和国家看起来像:

class Region {
    Long regionId;
    String regionName;
}

class Country {
    Long countryId;
    String countryName;
}

每个区域都有多个国家。我从 UI 中得到 List<Long> countryIdsList<Long> regionIds,我想将它们与 regionCountries 进行比较。所以我做了类似的事情:

List<RegionCountry> filteredList = regionCountries
                            .stream()
                            .filter(regionCountry -> regionIds.contains(regionCountry.getRegion().getRegionId()))
                            .filter(regionCountry -> regionCountry.getCountries()
                                                    .stream()
                                                    .allMatch(country -> countryIds.contains(country.getCountryId())))
                            .collect(Collectors.toList());
                        

但它没有返回任何东西。我想弄清楚如何比较 List<Long> countryIdsList<Country> countries of RegionCountry。在 Java 88+ 中使用 stream API 是否有更好的方法?或者可以通过使用任何其他方法来简化它吗?

提供的代码似乎很好并且可以工作,因此需要检查实际数据集是否满足提供的条件: regionIds 包含 rc.regionId AND countryIds 包含所有国家/地区的 ID。

Online demo (using record instead of classes to avoid boilerplate code):

non-filtered
RegionCountry[region=Region[regionId=1, regionName=Europe], countries=[Country[countryId=1, countryName=Albania], Country[countryId=2, countryName=Andorra], Country[countryId=6, countryName=Germany]]]
RegionCountry[region=Region[regionId=3, regionName=America], countries=[Country[countryId=15, countryName=Canada], Country[countryId=16, countryName=US]]]
region ids: [3, 1]
country ids: [1, 2, 3, 15, 6]
filtered
RegionCountry[region=Region[regionId=1, regionName=Europe], countries=[Country[countryId=1, countryName=Albania], Country[countryId=2, countryName=Andorra], Country[countryId=6, countryName=Germany]]]

一个小的优化是使用 Set 而不是 List 用于 regionIds, countryIds 以更快地检查 Set::contains.