从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();