使用流从映射列表中获取映射到与谓词匹配的键的值



我有一个映射mapList的列表。

我正在使用嵌套的for循环进行迭代,以获得

这是我的命令代码:

for(Map<String, Object> stringObjectMap : mapList){
for(Map.Entry<String, Object> entry : stringObjectMap.entrySet()){
if("SubmittedBy".equalsIgnoreCase(entry.getKey().trim())){
// Logics to implement
}
}
}

现在,我正在尝试使用Stream API实现它。

我需要从与键关联的Map中的一个String将忽略大小写匹配到字符串"SubmittedBy"

这是我的尝试:

String submittedBy = mapList.stream()
.filter(map -> map.entrySet().stream()
.filter(sub -> sub.getKey().equalsIgnoreCase("SubmittedBy")))
.findAny()
.get();

它会产生一个编译错误,说明返回类型不正确。我该怎么修?

Bad return type in lambda expression:
Stream<Entry<String, Object>> cannot be converted to boolean

您似乎想要获得映射到与"SubmittedBy"匹配的value。

你已经把过滤器搞砸了,而且你一开始就不需要嵌套流。

最初,您有一个映射流Stream<Map<String,Object>>

作为第一步,您需要使用flatMap()操作来压平每个映射条目,以获得条目流。

只有这样,您才需要应用filter()。操作findFirst()将提供一个可选的映射条目,要将其转换为Optional<String>,可以使用Optional.map()进行映射。

String submittedBy = mapList.stream()                                // Stream<Map<String, Object>>
.flatMap(map -> map.entrySet().stream())                         // Stream<Map.Entry<String, Object>>
.filter(entry -> entry.getKey().strip().equalsIgnoreCase("SubmittedBy"))
.findAny()                                                      // Optional<Map.Entry<String, Object>>
.map(entry -> (String) entry.getValue())                        // Optional<String>
.orElseThrow();

注意当您不检查可选中是否存在数据时,Optional.orElseThrow()优于Optional.get()(请参阅API注意(。

如果optional为空,这两个方法都会抛出NoSuchElementException,通过使用orElseThrow(),代码的读者可以清楚地了解您的意图(如果没有结果,throw(。


关于编译错误,正如您可能知道的,Predicate是一个生成boolean值的函数

要从流中生成值,需要应用终端操作。anyMatch()allMatch()noneMatch()—这些是返回boolean终端操作。

另一方面,filter()中间操作,这意味着它产生另一个流,而不是一个值。

有关更多信息,请参阅API文档流操作和管道

最新更新