Java8 快速实现List转map 、分组、过滤等操作

**  Java 8 是 Java 编程语言的一个重要版本,它引入了许多新特性和改进,使得 Java 开发变得更加高效和现代。**

下面我们就来使用Java8 快速实现List转map 、分组、过滤等操作。

定义1个用户对象

java 复制代码
public class User {
    
    private Integer id;
    
    private String name;
    
    private Integer age;
    
    private String phone;
    
    public User(Integer id, String name, Integer age, String phone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.phone = 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 Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

添加测试数据:

java 复制代码
List<User> userList = new ArrayList<>();

User user1 = new User(1, "张三", 18, "12345678901");

User user2 = new User(2, "李四", 18, "12345678901");

User user3 = new User(3, "王五", 18, "12345678901");

User user4 = new User(4, "李白", 18, "12345678901");

userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);

1、分组

List里面的对象元素,以某个属性来分组,例如,以id分组,将id相同的放在一起:

java 复制代码
Map<Integer, List<User>> groupBy = userList.stream().collect(Collectors.groupingBy(User::getId));

结果:
groupBy:{1=[User{id=1, name='张三', age=18, phone='12345678901'}], 2=[User{id=2, name='李四', age=18, phone='12345678901'}], 3=[User{id=3, name='王五', age=18, phone='12345678901'}], 4=[User{id=4, name='李白', age=18, phone='12345678901'}]}

2、List转Map

java 复制代码
Map<Integer, User> UserMap = userList.stream().collect(Collectors.toMap(User::getId, a -> a,(k1,k2)->k1));

结果:
userMap:{1=User{id=1, name='张三', age=18, phone='12345678901'}, 2=User{id=2, name='李四', age=18, phone='12345678901'}, 3=User{id=3, name='王五', age=18, phone='12345678901'}, 4=User{id=4, name='李白', age=18, phone='12345678901'}}

3、过滤Filter

java 复制代码
List<User> filterList = userList.stream().filter(a -> a.getName().equals("张三")).collect(Collectors.toList());

结果:
filterList:[User{id=1, name='张三', age=18, phone='12345678901'}]

4、求和

java 复制代码
Integer total= userList.stream().map(User::getAge).reduce(0, Integer::sum);

结果:
total:72

5、查找流中最大 最小值

java 复制代码
Optional<Dish> maxDish = Dish.menu.stream().
      collect(Collectors.maxBy(Comparator.comparing(Dish::getCalories)));
maxDish.ifPresent(System.out::println);
 
Optional<Dish> minDish = Dish.menu.stream().
      collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));
minDish.ifPresent(System.out::println);

6、去重

java 复制代码
List<Integer> unique = userList.stream().map(User::getAge).distinct().collect(Collectors.toList());

结果:
unique:[18]
相关推荐
码事漫谈8 小时前
黄仁勋被裁第一天,就收到了橄榄枝
后端
金銀銅鐵8 小时前
带您看懂字节码指令(二):空循环里有什么
java·后端·ai编程
皮皮林55110 小时前
比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!
后端
吴名氏.10 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
我不会起名字32211 小时前
会话缓存失效排查:区分 Redis 失效与节点广播
redis·后端·go·即时通讯·im·故障排查
.痞老板.11 小时前
java ee--多线程(进阶)
java·java-ee
Pniubi11 小时前
关于算法用现成数据结构和手撕
数据结构
深入云栈12 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
JackJiang12 小时前
IM踩坑:聊天消息ID怎么设计?一个UUID搞不定,我用双ID解决
后端·架构
Jackzhang12 小时前
[运维排障实录] 第一次遇到 502 别急着重启:按「一条线」把问题查清楚
spring boot