分享知识 传递快乐
描述:
取List集合中两个字段,将一两个字段作为key、value,利用Steam流转为map集合,当key相同时,将value转为List集合。
代码1:
package com.demo;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class AppDemo {
public static void main(String[] args) {
List<Integer> list = Lists.newArrayList(1, 7, 2, 5, 3, 4, 5, 1, 3, 6, 7);
Map<Integer, List<Integer>> map = list.stream().collect(Collectors.toMap(key -> key, value -> Lists.newArrayList(value),
(List<Integer> newValueList, List<Integer> oldValueList) -> {
oldValueList.addAll(newValueList);
return oldValueList;
}));
System.out.println(JSONUtil.toJsonStr(map));
}
}
结果:
{"1":[1,1],"2":[2],"3":[3,3],"4":[4],"5":[5,5],"6":[6],"7":[7,7]}
代码2:
package com.demo;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import lombok.Data;
import java.util.*;
import java.util.stream.Collectors;
public class AppDemo {
public static void main(String[] args) {
List<Menu> list = new LinkedList<>();
for (int i = 0; i < 10; i++) {
list.add(new Menu(1L, 0L, "菜单1"));
list.add(new Menu(2L, 1L, "菜单2"));
list.add(new Menu(3L, 1L, "菜单3"));
list.add(new Menu(4L, 2L, "菜单4"));
list.add(new Menu(5L, 3L, "菜单5"));
list.add(new Menu(6L, 3L, "菜单6"));
}
Map<Long, Set<Long>> map = list.stream().collect(Collectors.toMap(Menu::getParentId, item -> new HashSet<>(Arrays.asList(item.getId())),
(Set<Long> newValueList, Set<Long> oldValueList) -> {
oldValueList.addAll(newValueList);
return oldValueList;
})
);
System.out.println(JSONUtil.toJsonStr(map));
Map<Long, List<Menu>> map2 = list.stream().collect(Collectors.toMap(Menu::getParentId, item -> Lists.newArrayList(item),
(List<Menu> newValueList, List<Menu> oldValueList) -> {
oldValueList.addAll(newValueList);
return oldValueList;
})
);
System.out.println(JSONUtil.toJsonStr(map2));
// KEY重复问题
// 获取值
Map<Long, String> map3 = list.stream().collect(Collectors.toMap(Menu::getParentId, Menu::getName, (k1, k2) -> k1));
System.out.println(JSONUtil.toJsonStr(map3));
map3 = list.stream().collect(Collectors.toMap(Menu::getParentId, Menu::getName, (k1, k2) -> k2));
System.out.println(JSONUtil.toJsonStr(map3));
// 获取对象
Map<Long, Menu> map4 = list.stream().collect(Collectors.toMap(Menu::getParentId, item -> item, (k1, k2) -> k2));
System.out.println(JSONUtil.toJsonStr(map4));
map4 = list.stream().collect(Collectors.toMap(Menu::getParentId, Function.identity(), (k1, k2) -> k2));
System.out.println(JSONUtil.toJsonStr(map4));
}
}
@Data
class Menu {
private Long id;
private Long parentId;
private String name;
public Menu(Long id, Long parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
}
结果:
{"0":[1],"1":[2,3],"2":[4],"3":[5,6]}
{"0":[{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1}],"1":[{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2}],"2":[{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4}],"3":[{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5}]}
{"0":"菜单1","1":"菜单2","2":"菜单4","3":"菜单5"}
{"0":"菜单1","1":"菜单3","2":"菜单4","3":"菜单6"}
{"0":{"parentId":0,"name":"菜单1","id":1},"1":{"parentId":1,"name":"菜单3","id":3},"2":{"parentId":2,"name":"菜单4","id":4},"3":{"parentId":3,"name":"菜单6","id":6}}
{"0":{"parentId":0,"name":"菜单1","id":1},"1":{"parentId":1,"name":"菜单3","id":3},"2":{"parentId":2,"name":"菜单4","id":4},"3":{"parentId":3,"name":"菜单6","id":6}}
关于 Collectors.toMap 方法
Collectors.toMap 有三个重载方法:
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);
参数含义分别是:
- keyMapper:Key 的映射函数
- valueMapper:Value 的映射函数
- mergeFunction:当 Key 冲突时,调用的合并方法
- mapSupplier:Map 构造器,在需要返回特定的 Map 时使用
—————————
如有不足请留言指正
相互学习,共同进步