Jdk1.8中, 对于 list 有非常多的快捷操作方便我们处理数据,比如 list 转 map 对象操作, 在开发过程我们有时会在for循环过程中查询另一个表的数据,我们可以提前把数据查询出来,转换成map,使用过程中通过map获取数据,避免循环过程中多次查库操作,提升性能
list 转 map<String,对象> 操作如下
package com.example.demo.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author qiankun.hu
* @version 1.0.0
* @createTime 2021年06月30日 10:42:00
* @Description jdk1.8 list 流操作
*/
public class ListJdk8Test {
public static void main(String[] args) {
List<UserDetailInfo> list = new ArrayList<>();
UserDetailInfo info = null;
for (int i = 1; i <= 9 ; i++) {
info = new UserDetailInfo();
info.setId(i);
info.setName("张三");
info.setAge("年龄:"+i);
info.setPhone("1752131102"+i);
list.add(info);
}
Map<Integer,UserDetailInfo> userDetailInfoMap = list.stream().collect(Collectors.toMap(UserDetailInfo::getId,(s ->s)));
Set<Map.Entry<Integer, UserDetailInfo>> entrys = userDetailInfoMap.entrySet();
for(Map.Entry<Integer, UserDetailInfo> entry:entrys){
System.out.println("key值:"+entry.getKey()+" value值:"+entry.getValue());
}
}
static class UserDetailInfo{
private Integer id;
private String name;
private String age;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "UserDetailInfo{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
}
输出结果
key值:1 value值:UserDetailInfo{id=1, name='张三', age='年龄:1', phone='17521311021'}
key值:2 value值:UserDetailInfo{id=2, name='张三', age='年龄:2', phone='17521311022'}
key值:3 value值:UserDetailInfo{id=3, name='张三', age='年龄:3', phone='17521311023'}
key值:4 value值:UserDetailInfo{id=4, name='张三', age='年龄:4', phone='17521311024'}
key值:5 value值:UserDetailInfo{id=5, name='张三', age='年龄:5', phone='17521311025'}
key值:6 value值:UserDetailInfo{id=6, name='张三', age='年龄:6', phone='17521311026'}
key值:7 value值:UserDetailInfo{id=7, name='张三', age='年龄:7', phone='17521311027'}
key值:8 value值:UserDetailInfo{id=8, name='张三', age='年龄:8', phone='17521311028'}
key值:9 value值:UserDetailInfo{id=9, name='张三', age='年龄:9', phone='17521311029'}
如果是转换成 Map<String,String> 只需更改后面的值既可,如图,这里是 ID 对应 name
Map<Integer,String> userDetailInfoMap = list.stream().collect(Collectors.toMap(UserDetailInfo::getId,(s ->s.getName())));
list<对象>,转换成 list<String>
List<String> StrList = list.stream().map(UserDetailInfo::getPhone).collect(Collectors.toList());
list<对象>,转换成 Set<String>
Set<String> StrList = list.stream().map(UserDetailInfo::getPhone).collect(Collectors.toSet());
list 过滤 循环处理对象,如果年龄不为空 ,设置手机号为 110
list.stream().filter(s -> (s.getAge() != null )).forEach(s -> s.setPhone("110"));
根据手机号 分组 Map<String,List<对象>> ,比如每个老师带了几个班,每个省会下面多少个市,都可以这样查询处理
public static void main(String[] args) {
List<UserDetailInfo> list = new ArrayList<>();
UserDetailInfo info = null;
for (int i = 1; i <= 9 ; i++) {
info = new UserDetailInfo();
info.setId(i);
info.setName("张三:"+i);
info.setAge("年龄:"+i);
info.setPhone("110");
list.add(info);
}
for (int i = 1; i <= 9 ; i++) {
info = new UserDetailInfo();
info.setId(i);
info.setName("张三:"+i);
info.setAge("年龄:"+i);
info.setPhone("120");
list.add(info);
}
Map<String,List<UserDetailInfo>> map = list.stream().collect(Collectors.groupingBy(UserDetailInfo::getPhone));
}
List<对象> 转 Map<String, List<String>>
Map<String,List<String>> map = list.stream()
.collect(Collectors.groupingBy(StudentDto::getAge,Collectors.mapping(StudentDto::getName,Collectors.toList())));
List<对象> 多个字段分组转 Map<String, List<String>>
private String appId;
private String i18nKey;
private String tagId;
public static void main(String[] args) {
List<I18nRefTag> list = new ArrayList<>();
for (int i = 0; i < 3 ; i++) {
I18nRefTag tag = new I18nRefTag();
tag.setTagId(i+"");
tag.setAppId("edc");
tag.setI18nKey("lk");
list.add(tag);
}
for (int i = 0; i < 3 ; i++) {
I18nRefTag tag = new I18nRefTag();
tag.setTagId(i+"");
tag.setAppId("ccp");
tag.setI18nKey("dgz");
list.add(tag);
}
Map<String, List<I18nRefTag>> groupedMap = list.stream().collect(Collectors.groupingBy(item -> (item.getAppId() + "#" + item.getI18nKey())));
Map<String, List<String>> resultMap = groupedMap.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream().map(I18nRefTag::getTagId).collect(Collectors.toList())
));
System.out.println(resultMap);
}