> 如果根映射键包含返回映射值,java,java-8,java-stream"/>

首页 > 解决方案 > Java 8 流映射> 如果根映射键包含返回映射值

问题描述

我有一张地图:

Map<String, Map<String, Integer>> rootMap

Map<String, Integer>如果rootMap键包含stringValue使用流,我想返回 rootMap 值。

我试过了:

rootMap.entrySet().stream().filter(e -> e.getKey().contains(stringValue)).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

但我得到Map<Object, Object>而不是Map<String, Integer>

更新#1

// it's a class with one field and a helper method
// @Data is a Lombok annotation
@Data
public class A {

    public Map<String, Map<String, Integer>> rootMap;

    public Map<String, Integer> getValuesByKey(String stringValue) {
        return rootMap.entrySet().stream().filter(e -> e.getKey().contains(stringValue)).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    }
}

标签: javajava-8java-stream

解决方案


这是你的表达:

rootMap.entrySet()
    .stream()
    .filter(e -> e.getKey().contains(stringValue))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

这是你的目标:

如果 rootMap 键包含使用流的 stringValue,我想返回 rootMap 值 Map<String, Integer>。

回想一下,映射键必须是唯一的。您不能拥有多个Map.Entry具有相同密钥的相同实例。因此,您可以获取Map<String, Integer>对应的key,rootMap其值stringValue如下:

rootMap.entrySet()
    .stream()
    .filter(e -> e.getKey().equals(stringValue))
    .map(e -> e.getValue())
    .findAny()
    .get();

要在密钥不存在的情况下防止错误,rootMap您可以使用此版本:

rootMap.entrySet()
    .stream()
    .filter(e -> e.getKey().equals(stringValue))
    .map(e -> e.getValue())
    .findAny()
    .orElse(Collections.emptyMap());

推荐阅读