使用流检查一个列表中的值是否存在于另一个列表中
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> countryIds
和 List<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> countryIds
与 List<Country> countries
of RegionCountry
。在 Java 8
或 8+
中使用 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
.
我有 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> countryIds
和 List<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> countryIds
与 List<Country> countries
of RegionCountry
。在 Java 8
或 8+
中使用 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
.