我有一个映射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文档流操作和管道。