MultiValueMap Lambda问题

时间:2018-05-27 19:13:06

标签: java java-8

我最近从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必须是最终的或有效的

问题

  1. 如何解决这个问题?

  2. 如果我需要列表而不是MultiValueMap queryParams中的列表,那么最小代码是什么;

3 个答案:

答案 0 :(得分:2)

您可以直接使用getOrDefaultget方法

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);