Stream流式编程代码解析
流式写法是 Java 8 引入的 Stream API 结合 Collectors 工具类的用法,主要用于将集合转换为 Map。我们可以逐部分解析它的含义和工作原理:
Map<String, LoginBizConf> newLoginBizConfigMap = loginBizConfList.stream()
.collect(Collectors.toMap(
LoginBizConf::getUniqueKey, // 第一个参数:生成Map的key
Function.identity(), // 第二个参数:生成Map的value
(k1, k2) -> k2 // 第三个参数:key冲突时的处理策略
));
逐部分解析:
-
loginBizConfList.stream()
将原始的列表(loginBizConfList)转换为 Stream 流,开启流式处理。
流就像一个"管道",可以对集合中的元素进行一系列链式操作(这里主要用于后续的收集操作)。 -
collect(Collectors.toMap(...))
这是流的终止操作,用于将流中的元素收集到一个 Map 中。Collectors.toMap()是专门用来生成 Map 的收集器,需要传入三个核心参数: -
第一个参数:
LoginBizConf::getUniqueKey
这是一个"方法引用",表示用LoginBizConf对象的getUniqueKey()方法的返回值作为 Map 的 key。
等价于匿名内部类写法:(LoginBizConf config) -> config.getUniqueKey()
通俗说:“用每个元素的 uniqueKey 字段作为 Map 的键”。 -
第二个参数:
Function.identity()
Function.identity()是一个静态方法,表示"返回元素本身",即 Map 的 value 就是LoginBizConf对象自己。
等价于:(LoginBizConf config) -> config
通俗说:“用元素本身作为 Map 的值”。 -
第三个参数:
(k1, k2) -> k2
这是一个"合并函数",用于处理 key 重复的情况:- 当流中出现两个元素的
uniqueKey相同时(即 key 冲突),k1代表先出现的元素的值,k2代表后出现的元素的值。 (k1, k2) -> k2表示"用后出现的元素覆盖先出现的元素"。
若不指定这个参数,当 key 重复时会直接抛出IllegalStateException异常。
- 当流中出现两个元素的
整体逻辑总结:
这段代码的作用是:
遍历 loginBizConfList 中的所有 LoginBizConf 对象,将它们存入一个 Map 中。其中,Map 的键是每个对象的 uniqueKey,值是对象本身;如果出现重复的 uniqueKey,则保留后面出现的那个对象。
虽然写法简洁,但确实需要对 Stream API、方法引用、函数式接口有一定了解才能快速理解。如果团队中对函数式编程不太熟悉,用传统 for 循环写法(如之前提到的)会更易读。
1113



被折叠的 条评论
为什么被折叠?



