首页 > 解决方案 > 通过 Stream 过滤操作并维护为 map 而不是 Stream

问题描述

我目前正在从外部 api 调用中获取地图数据。
我想确保数据不为空或为空,并
通过过滤到地图中的特定键并将结果捕获到另一个对象中来对其执行一组操作。

密钥本身以逗号分隔。

地图中的示例键/值。

"key1,key2,key3,id100" : {
     "val1: "",
     "val2: "",
     "val3: "",
     ... others
}

我正在过滤以捕获此键下的所有值(因此数据 cal1、val2、val3 等),然后执行一些操作。

但是当我执行如图所示的过滤器时,我最终得到了一个流。

因此,我最终得到的不仅仅是Map<String, Object> ,而是Stream<Map.Entry<String, Object>>

尝试过平面图并出现以下错误:

不存在类型变量 U 的实例,因此 Stream<Entry<String, Object>> 符合 Optional

如何将其从 Stream 转换回 Map 或更好的过滤方式?谢谢。

本来可以通过没有 Streams 的 for 循环完成此操作,但尝试查看如何
在 Stream 实现中实现此目的,因此无需寻找 for 循环解决方案。请指教。谢谢。

private NewObject get() {

    Map<String, Object> data = // data filled in by an external rest call;

    return Optional.ofNullable(data)

        // using flatmap here throws above error
        .map(Map::entrySet)
        .map(entries -> entries.stream()
                .filter(entry -> entry.getKey().contains("id100))

        // I wish to carry on further operations from here by using the filtered map. 
        // having issues cos capturedData is a Stream 

        // even if using flatmap at this stage, capturedData is still a Stream.
        // wanting to do the following but can't due to it being a Stream and not a map 
        ).map(capturedData -> {
            Map<String, Object> at = (Map<String, Object>) capturedData;

            NewObject newObject = new NewObject();
            newObject.setName((String) at.get("val1"));

            return newObject;

        }).orElse(null);
}

标签: javajava-8

解决方案


用于map构造NewObject和用于findFirst获取第一个值(根据您的评论,只有一个条目的键具有 substring id100)。最后使用flatMap解包Optional<NewObject>

return Optional.ofNullable(data)
    .map(Map::entrySet)
    .flatMap(entries -> entries.stream()
            .filter(entry -> entry.getKey().contains("id100"))
            .map(entry -> {
                NewObject newObject = new NewObject();
                Map<String, String> nestedMap = (Map<String, String>) entry.getValue();
                newObject.setName(nestedMap.get("val1"));
                return newObject;
            })
            .findFirst())
    .orElse(null);

推荐阅读