JDK8 lambda操作list常用功能,list转map,list选取字段拼接字符串,分组,统计

时间:2025-05-12 09:09:04

新建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();
    }