在地图java流列表中查找地图

时间:2018-01-12 10:47:23

标签: java list hashmap java-stream

我正在迭代Hashmap列表,使用以下代码查找所需的HashMap对象。

public static Map<String, String> extractMap(List<Map<String, String>> mapList, String currentIp) {
    for (Map<String, String> asd : mapList) {
        if (asd.get("ip").equals(currentIp)) {
            return asd;
        }
    }
    return null;
}

我在考虑使用Java 8流。这是我用来显示所需对象的代码。

public static void displayRequiredMapFromList(List<Map<String, String>> mapList, String currentIp) {
    mapList.stream().filter(e -> e.get("ip").equals(currentIp)).forEach(System.out::println);
}

我无法使用以下代码

从流中获取所需的地图
public static Map<String, String> extractMapByStream(List<Map<String, String>> mapList, String currentIp) {
    return mapList.stream().filter(e -> e.get("ip").equals(currentIp))
            .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
}

这会导致语法错误类型不匹配:无法从Map转换为Map 。我有什么要放到这里来获取地图?

3 个答案:

答案 0 :(得分:6)

您不希望.collect任何事情。您想要找到与谓词匹配的第一个地图。

因此,您应该使用.findFirst()代替.collect()

toMap()用于根据流中的元素构建Map

但你不想这样做,每个元素都已经是Map

答案 1 :(得分:1)

用户

    public static Map<String, String> extractMapByStream(List<Map<String, String>> mapList, String currentIp) {
        return mapList.stream().filter(e -> e.get("ip").equals(currentIp))
            .findFirst().get();
}

答案 2 :(得分:1)

这将有效,没有orElse()的其他示例不能编译(至少它们不在我的IDE中)。

mapList.stream()
    .filter(asd -> asd.get("ip").equals(currentIp))
    .findFirst()
    .orElse(null);

我作为建议添加的唯一内容是返回Collections.emptyMap(),这将在调用代码中保存空检查。

要在没有orElse的情况下编译代码,您需要将方法签名更改为:

public static Optional<Map<String, String>> extractMap(List<Map<String, String>> mapList, String currentIp)