Map<String, DoItemDTO> productMap = doItemList.stream().collect(Collectors.toMap(x -> String.format("%s%s", x.getProductCode(), x.getBarCodeUnit()),
Function.identity(), (o1, o2) -> o1));
3个参数分别是什么意思,Function.identity()是干涉么的
Collectors.toMap将集合转换为map,它的原型是
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
需要3个参数,x -> String.format("%s%s". x.getProductCode(), x.getBarCodeUnit()) 这个是键选择器,这里传入的lambda是
将集合的每一项转换为一个字符串,这个字符串是把ProductCode和CodeUnit组合起来。作为map里面的key。
Function.identity(),这是值选择器,前面说了,它就是x -> x,也就是map的value是每一项它本身
(o1, o2) -> o1这个是合并函数,就是如果遇到同一个键遇到多个值,用它可以累加起来,但是这里o1,o2直接选择o1,就是把相同的其余项丢掉。
这段代码执行之后,doItemList将会变成一个map,它的键是x.getProductCode()和 x.getBarCodeUnit()连起来,值是对应的doItemList那一项,你可以通过前者构成的字符串检索到对应的那条记录。
Function.identity():返回一个执行了apply()方法之后只会返回输入参数的函数对象。apply():将Function对象应用到输入的参数上,然后返回计算结果。
就是将你的list集合转为map集合,String.format就不说了,Function.identity()是你指定转map的一个具体实现,(o1, o2) -> o1)这个我记得好像是map中如果有重复的key时,取其中的一个key,
就是o1或者o2。如果说错了,请见谅,java8我也没怎么用
https://stackoverflow.com/questions/28032827/java-8-lambdas-function-identity-or-t-t
根据这个文章的描述
Function.identity()
其实就是一个预先写好的lambda表达式
x -> x
Function.identity()和x -> x等价,只是前者可以节约一点内存。
不知道你理解了没有,如果没有理解,可以追问。
map 传入参数的 函数处理,返回处理结果(此时stream中的是返回的结果stream) collect 进行 集合处理 对应为map 前一个是key的生成,后面是val的生成,最后是对遇到相同key时的的取舍问题。