Java 8使用密钥复制检查将2D数组转换为Map

Bur*_*man 4 java java-8 java-stream

java 8如何array使用2D将2D 转换为Map stream().如果键值已经存在,它也应该更新值.

String[][] array=new String[][]{{"a","b"},{"a","c"},{"b","d"}};
HashMap<String,String> map=new HashMap<String,String>();
for(String[] arr:array){
   map.put(arr[0],arr[1]);
}
Run Code Online (Sandbox Code Playgroud)

我试过这个

map=Arrays.stream(array).collect(Collectors.toMap(x->x[0],x->x[1]));
Run Code Online (Sandbox Code Playgroud)

错误

错误:(38,45)java:不兼容类型:推理变量R具有不兼容的边界等式约束:java.util.Map上限:java.util.HashMap,java.lang.Object

eme*_*esx 6

添加合并重复键的运算符:

String[][] array = new String[][]{{"a", "b"}, {"a", "c"}, {"b", "d"}};

Map<String, String> m = Arrays.stream(array)
                              .collect(Collectors.toMap(  kv -> kv[0],
                                                          kv -> kv[1],
                                                          (oldV, newV) -> newV)
                                                       ));
Run Code Online (Sandbox Code Playgroud)

格式化这些单行将是有一天的问题..

  • @Exbury因为`toMap`被定义为`public static <T,K,U> Collector <T,?,Map <K,U >> toMap`,带有`Map <>`返回类型.您必须手动向下转换为实现. (3认同)
  • 当规范从不保证它将是一个`HashMap`时,不要将`Map`强制转换为`HashMap`.如果你真的需要它是一个`HashMap`,使用`Collectors.toMap(KV - > KV [0],KV - > KV [1],(oldV,newV) - > newV,HashMap中::新)` (3认同)