我最近从php转到java,所以我的java技能很低。
在我的代码中,我得到了一个名为queryParams的MultiValueMap
MultiValueMap<String, String> queryParams;
示例值可以是{matchedMe=[11,22]}
必需,我需要在变量listOfIds上设置列表[11,22],所以我编写了下面的代码。
List<String> listOfIds = null;
queryParams.forEach((k, v)->{
if(k.equals("matchedMe")){
listOfIds = v;
}
}
);
问题: 得到错误:在封闭范围内定义的lambda局部变量seenIds必须是最终的或有效的
问题
如何解决这个问题?
如果我需要列表而不是MultiValueMap queryParams中的列表,那么最小代码是什么;
答案 0 :(得分:2)
您可以直接使用getOrDefault
或get
方法
List<String> listOfIds = queryParams.getOrDefault("matchedMe", emptyList());
当MultiValueMap<K, V>
扩展Map<K, List<V>>
时,您可以直接使用为Map
接口定义的方法
答案 1 :(得分:0)
对于lambda,与任何匿名类一样,您不能将新值分配给lambda之外的属性。 listOfIds
(实际上)是final,但在Java 8中,编译器不强制使用此关键字,尽管规则保持不变。
您只需调用值:
List<String> listOfIds = queryParams
.getOrDefault("matchedMe",Collections.emptyList()); // will return values, or empty List (to prevent null values)
或
List<String> listOfIds = queryParams.entrySet().stream()
.filter((k,v)-> "matchedMe".equals(k)) // filter by key
.findFirst()
.map(Map.Entry::getValue) // return if value exists
.orElse(Collections.emptyList());
答案 2 :(得分:0)
试试这个,
final List<String> paramList = queryParams.entrySet().stream()
.filter(entry -> entry.getKey().equals("matchedMe")).map(entry -> entry.getValue()).findFirst()
.orElse(null);