Java中List转Map List实现的几种姿势(java stream list转list)

网友投稿 774 2022-07-27


今天介绍一个实用的小知识点,如何将List转为Map>

1. 基本写法

最开始介绍的当然是最常见、最直观的写法,当然也是任何限制的写法

// 比如将下面的列表,按照字符串长度进行分组

List list = new ArrayList<>();

list.add("hello");

list.add("word");

list.add("come");

list.add("on");

Map> ans = new HashMap<>();

for(String str: list) {

List sub = ans.get(str.length());

if(sub == null) {

sub = new ArrayList<>();

ans.put(str.length(), sub);

}

sub.add(str);

}

System.out.println(ans);

对于jdk8+,上面for循环中的内容可以利用Map.computeIfAbsent来替换,具体写法如下

for (String str : list) {

ans.computeIfAboRJjbsent(str.length(), k -> new ArrayList<>()).add(str);

}

当然既然已经是jdk1.8了,借助Stream的流处理,可以将上面的更一步进行简化,如下

Map> ans = list.stream().collect(Collectors.groupingBy(String::length));

2. 通用方法

上面是针对特定的列表,针对业务进行开发转换,那么我们接下来尝试构建一个通用的工具类

这里我们主要借助的知识点就是泛型,一个重要的点就是如何获取Map中的key对于jdk < 1.8的写法,通过接口来定义实现key的获取姿势

public static Map> toMapList(List list, KeyFunc keyFunc) {

Map> result = new HashMap<>();

for (V item: list) {

K key = keyFunc.getKey(item);

if (!result.containsKey(key)) {

result.put(key, new ArrayList<>());

}

result.get(key).add(item);

}

return result;

}

public static interface KeyFunc {

K getKey(T t);

}

使用demo如下

public static void main(String[] args) {

List list = new ArrayList<>();

list.add("hello");

list.add("word");

list.add("come");

list.add("on");

Map> res = toMapList(list, new KeyFunc() {

@Override

public Integer getKey(String s) {

return s.length();

}

});

System.out.println(res);

}

接下来再看一下jdk1.8之后的写法,结合stream + 函数方法来实现

public static Map> toMapList(List list, Function func) {

return list.stream().collect(Collectors.groupingBy(func));

}

其对应的使用方式则如下

public static void main(String[] args) {

List list = new ArrayList<>();

list.add("hello");

list.add("word");

list.add("come");

list.add("on");

Map> res = toMapList(list, (Function) String::length);

System.out.println(res);

}

3. 工具类

上一节介绍了基于泛型 + jdk8 Stream + 函数方法来实现通用转换工具类的实现姿势,接下来我们小结一下,输出一个适用于1.8之后的工具类

/**

* List转换为Map> 特点在于Map中的value,是个列表,且列表中的元素就是从原列表中的元素

*

* @param list

* @param func 基于list#item生成Map.key的函数方法

* @param

* @param

* @return

*/

public static Map> toMapList(List list, Function func) {

return list.stream().collect(Collectors.groupingBy(func));

}

/**

* List转换为Map> 特点在于Map中的value是个列表,且列表中的元素是由list.item转换而来

*

* @param list

* @param keyFunc 基于list#item生成的Map.key的函数方法

* @param valFunc 基于list#item转换Map.value列表中元素的函数方法

* @param

* @param

* @param

* @return

*/

public static Map> toMapList(List list, Function keyFunc, Function valFunc) {

return list.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valFunc, Collectors.toList())));

}

4.guava HashMultimap扩展知识点

最后再介绍一个扩展知识点,Gauva工具包中提供了一个HashMultimap的工具类,他的使用姿势和我们平常的Map并无差别,但是需要在注意的是,它的value是个集合

List list = new ArrayList<>();

list.add("hello");

list.add("word");

list.add("come");

list.add("on");

list.add("on");

HashMultimap map = HashMultimap.create();

for (String item: strList) {

map.put(item.length(), item);

}

System.out.println(map);

实际输出如下,验证了value实际上是个集合(on只有一个,如果是我们上面的工具类,会输出两个)

{2=[on], 4=[word, come], 5=[hello]}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot分页查询功能的实现方法(springboot多条件分页查询)
下一篇:Springboot 集成spring cache缓存的解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~