从Java8中的映射列表中获取字符串
我有:从Java8中的映射列表中获取字符串,java,java-8,java-stream,Java,Java 8,Java Stream,我有:列出国家,我能够通过以下方式获得我感兴趣的价值: String value = ""; for (int i = 0; i < countries.size(); i++) { Map<String, String> map = countries.get(i); if (map.containsValue(country)) { value = map.get(COUNTRY_N
列出国家
,我能够通过以下方式获得我感兴趣的价值:
String value = "";
for (int i = 0; i < countries.size(); i++) {
Map<String, String> map = countries.get(i);
if (map.containsValue(country)) {
value = map.get(COUNTRY_NAME);
}
}
return value;
字符串值=”;
对于(int i=0;i
所以一般来说,如果地图中的国家是我感兴趣的,那么我取值,其中关键是国家名称
如何将其转换为流?我试着这样做:
for (Map<String, String> m : countries) {
description = String.valueOf(m.entrySet()
.stream()
.filter(map -> map.getValue().equals(country))
.findFirst());
}
for(地图m:国家){
description=String.valueOf(m.entrySet()
.stream()
.filter(map->map.getValue().equals(国家))
.findFirst());
}
但首先它不起作用,其次我仍然用于每个循环。我想你可以试试:
Stream.of(countries).reduce(Stream::concat)
.filter(map -> map.getValue().equals(country))
.findFirst();
似乎显示了可以帮助您的东西。请检查以下内容:
Optional<Map<String, String>> countryOpt = countries
.stream()
.filter(c -> c.containsValue(COUNTRY_NAME))
.findAny();
if (countryOpt.isPresent()) {
value = countryOpt.get().get(COUNTRY_NAME);
}
可选countryOpt=国家/地区
.stream()
.filter(c->c.containsValue(国家/地区名称))
.findAny();
if(countryOpt.isPresent()){
value=countryOpt.get().get(国家名称);
}
如果映射包含值,则需要对其进行过滤,然后使用.map()
转换数据,然后在之后使用.findFirst()
如果未找到,则使用.orElse()
返回默认值
String value = countries.stream()
.filter(m -> m.containsValue(country))
.map(m -> m.get(COUNTRY_NAME))
.findFirst()
.orElse("");
Optional countryOptional=countries.stream()
.filter(kvp->kvp.containsKey(国家/地区名称))
.map(kvp->kvp.get(国家/地区名称))
.findFirst();
无论关联的键是什么,都需要存在特定的值,这是一个非常奇怪的要求。另外,containsValue(country)
将线性搜索整个地图,您将对每个地图重复搜索,直到找到匹配项为止,这非常昂贵,并且违背了地图为特定键提供高效查找的目的。很好,谢谢@Holger!老实说,我的映射很小,最大n=9个元素,所以我不关心线性搜索O(n),但定位很好。@Holger,需要存在一个特定的值,而不管关联的键是什么,这是一个非常奇怪的要求
-这不是真的。我接受关联键的值。如果(map.containsValue(country)),则value=map.get(country\u NAME)
对于streams(@Eklavya answer)也有一个先过滤然后取值的过滤器,因此过滤后只有一个值。包含值(国家)
和映射。获取(国家名称)
之间没有联系。前者告知值country
是否存在,而不管关联的键是什么,后者将返回键country\u NAME
的关联值,该键不一定是country
。事实上,如果键COUNTRY\u NAME
与值COUNTRY
关联,则整个操作的意义就更小了。为什么有人在事先知道关联值的情况下执行地图查找?这与循环或流无关,在这两种情况下都没有意义。
Optional<String> countryOptional = countries.stream()
.filter(kvp -> kvp.containsKey(COUNTRY_NAME))
.map(kvp -> kvp.get(COUNTRY_NAME))
.findFirst();