gpt4 book ai didi

java - 通过 Stream 过滤操作并维护为 map 而不是 Stream

转载 作者:行者123 更新时间:2023-12-04 14:05:24 24 4
gpt4 key购买 nike

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

key 本身以逗号分隔。

map 中的示例键/值。

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

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

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

因此,我得到的不是 Map ,而是 Stream >

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

no instance(s) of type variable(s) U exist so thatStream<Entry<String, Object>> conforms to Optional

如何将它从流中转换回 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);
}

最佳答案

使用 map构建 NewObject并使用 findFirst获取第一个值(根据您的评论,只有一个条目的键具有子字符串 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);

关于java - 通过 Stream 过滤操作并维护为 map 而不是 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68746164/

24 4 0