新建UserDTO对象:
package com.list;
import lombok.Data;
@Data
public class UserDTO {
public UserDTO(){}
public UserDTO(Integer id, String userName, String mobile){
this.id = id;
this.userName = userName;
this.mobile = mobile;
}
private Integer id;
private String userName;
private String mobile;
}
一、list转map的几种方式
package com.list;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class TestList {
public static void main(String args[]){
listToMap();
}
// list转map
public static void listToMap(){
List<UserDTO> list = getListUser();
// 指定key-value,value是对象中的某个属性值
Map<Integer, String> map1 = list.stream().collect(Collectors.toMap(UserDTO::getId, UserDTO::getMobile, (key1, key2) -> key2));
System.out.println("map1:" + map1.toString());
// 结果 map1:{1=13100000001, 2=13100000002, 3=13100000003}
// 指定key-value,value是对象本身,UserDTO->UserDTO 是一个返回本身的lambda表达式
Map<Integer, UserDTO> map2 = list.stream().collect(Collectors.toMap(UserDTO::getId, UserDTO -> UserDTO));
System.out.println("map2:" + map2.toString());
// 结果 map2:{1=UserDTO(id=1, userName=张1, mobile=13100000001), 2=UserDTO(id=2, userName=张2, mobile=13100000002), 3=UserDTO(id=3, userName=张3, mobile=13100000003)}
// 指定key-value,value是对象本身,key 冲突的解决办法,如果key相同,这里选择第二个key覆盖第一个key
Map<Integer, UserDTO> map3 = list.stream().collect(Collectors.toMap(UserDTO::getId, Function.identity(),(key1, key2)->key2));
System.out.println("map3:" + map3.toString());
// 结果 map3:{1=UserDTO(id=1, userName=张1, mobile=13100000001), 2=UserDTO(id=2, userName=张2, mobile=13100000002), 3=UserDTO(id=3, userName=张3, mobile=13100000003)}
}
// 获取假数据
public static List<UserDTO> getListUser(){
List<UserDTO> list = new ArrayList<>();
for(int i = 1; i < 4; i++){
UserDTO u = new UserDTO(i, "张" + i, "1310000000" + i);
list.add(u);
}
return list;
}
}
二、list选择对象中的某个字段拼接成字符串
public static void listJoining(){
List<UserDTO> list = getListUser();
// 对对象里面的mobile使用,拼接成字符串返回
String mobileStr = list.stream().map(r -> r.getMobile()).collect(Collectors.joining(","));
System.out.println("mobileStr:" +mobileStr);
// 结果 mobileStr:13100000001,13100000002,13100000003
}
三、list过滤数据
public static void listFilter(){
List<UserDTO> list = getListUser();
// 返回id=1的数据
List<UserDTO> collect = list.stream().filter(item -> item.getId() == 1).collect(Collectors.toList());
System.out.println("collect:" +collect);
// 结果 collect:[UserDTO(id=1, userName=张1, mobile=13100000001)]
}
四、list根据指定key分组
public static void groupingBy(){
// 对象分组
List<UserDTO> list = getListUser();
// 根据id分组
Map<Integer, List<UserDTO>> map = list.stream().collect(Collectors.groupingBy(UserDTO::getId));
System.out.println("map:" +map);
// 结果 map:{1=[UserDTO(id=1, userName=张1, mobile=13100000001)], 2=[UserDTO(id=2, userName=张2, mobile=13100000002)], 3=[UserDTO(id=3, userName=张3, mobile=13100000003)]}
// list里面map分组
List<Map<String,Object>> listMap = new ArrayList<>();
Map<String,Object> map1=new HashMap<>();
map1.put("id",1);
map1.put("userName","张1");
listMap.add(map1);
Map<String,Object> map2=new HashMap<>();
map2.put("id",2);
map2.put("userName","张2");
listMap.add(map2);
Map<Integer, List<Map<String, Object>>> ids = listMap.stream().collect(Collectors.groupingBy(item -> {
return (int)item.get("id");
}));
}
五、list指定字段取和
public static void count(){
List<UserDTO> list = getListUser();
// 统计id不为Null的总数
long count = list.stream().filter(e -> null != e.getId()).count();
System.out.println("count:" + count);
// 结果count:3
// 根据id取和
int sum = list.stream().mapToInt(UserDTO::getId).sum();
System.out.println("sum:" + sum);
// 结果sum:6
// 根据某个字段获取数组里面最大的一个
UserDTO user = list.stream().max(Comparator.comparing(UserDTO::getId)).get();
}