.collect(Collectors.toMap(ProInsDutyRelation::getcId, a -> a, (k1, k2) -> k1));
第一个参数ProInsDutyRelation::getcId表示选择ProInsDutyRelation的getcId作为map的key值;
第二个参数a -> a表示选择将原来的对象作为map的value值;
第三个参数(k1, k2) -> k1中,如果k1与k2的key值相同,选择k1作为那个key所对应的value值
第一个参数**a -> a.getId()**就是 R apply(T t) 的实现,入参是 Student 类型的对象 a,返回 a.getId()
第二个参数a -> a也是 R apply(T t) 的实现,入参是 Student 类型的 a,返回 a 本身
第三个参数**(a, b) -> a**是 R apply(T t, U u) 的实现,入参是Student 类型的 a 和 b,返回是第一个入参 a,Stream 里把它用作当两个对象 a 和 b 的 key 相同时,value 就取第一个元素 a
其中第二个参数 a -> a 在 Stream 里表示从 list 转为 map 时的 value 值,就用原来的对象自己,你肯定还见过这样的写法。
Collectors.toMap(a -> a.getId(), Function.identity(), (a, b) -> a)
学会理解和写 Lambda 表达式,别忘了最开始的三步。
1. 确认 Lambda 表达式的类型
2. 找到要实现的方法
3. 实现这个方法
Lambda 表达式的类型就是函数式接口,要实现的方法就是函数式接口里那个唯一的抽象方法,实现这个方法的方式就是参数块 + 小箭头 + 方法体,其中参数块和方法体都可以一定程度上简化它的写法。
https://dev.java/learn/tutorial/getting-to-know-the-language/lambda-expressions/lambdas.html