最近看到一行比较有趣的代码,他的功能就是将List转换为Map。我觉得挺有意思的,先前没遇到过,于是打算写篇文章记录一下。
public enum CodeEnum {USER("user"),AGE("age"),INTEREST("interest"),;private String code;public String getCode() {return code;}CodeEnum(String code) {this.code = code;}private static final Map<String, CodeEnum> map = null;public static CodeEnum of(String code) {return map.get(code);}
}
我有一个enum枚举类,其中含有3个枚举常量。我现在需要将这三个枚举常量统一转化为Map结构的数据。key是enum的code,value就是enum本身。
下方代码可以一行实现这个功能
private static final Map<String, CodeEnum> map = Arrays.stream(CodeEnum.values()).collect(Collectors.toMap(CodeEnum::getCode, Function.identity()));
我们逐步介绍一下这行代码的功能
- CodeEnum.values() :将CodeEnum中的枚举常量以数组的形式返回,按照上方代码可以简单理解为将USER、AGE、INTEREST这三个枚举常量打包,以Array的形式返回
- Arrays.stream() :将数组转换为stream数据流
- .collect(Collectors.toMap(CodeEnum::getCode, Function.identity())) :
.collect()
将stream中的每一个数据收集起来,并使用toMap
操作每一个元素 - Collectors.toMap(CodeEnum::getCode, Function.identity()) : toMap接受两个函数,第一个函数用于确定map的key,第二个函数确定map的value。具体来说,toMap是做如下操作。
- 遍历stream中的每一个元素
- 将stream的CodeEnum元素传递给CodeEnum::getCode,函数将对象的code返回,作为map的key
- 将CodeEnum元素传递给Function.identity(),Function.identity()是个身份函数,返回值等于传入值,写法上等同于t -> t
map值输出