JAVA8 新特性 Stream API 、Lambda 表达式 引用

JAVA8 List转换Map 之 Collectors.toMap()

前言
工作时会经常使用List对象集合转换Map集合、以及各种集合的转换、查询、筛选,从而方便后续操作。

一、利用stream().forEach()遍历集合

List<String> list = new ArrayList<String>();
list.add("djk");
list.add("djk1");
list.add("djk12");
list.add("djk123");
//利用stream().forEach()遍历集合
list.stream().forEach(item->{System.out.print(item+" ");});

在这里插入图片描述

二、利用stream().map()对List进行大写处理,并给另外一个List赋值,并对其遍历

List<String> list = new ArrayList<String>();
        list.add("list1");
        list.add("list2");
        list.add("list3");
        list.add("list4");
        List<String> list4 = new ArrayList<String>(); //同理 toLowerCase
        list4 = list.stream().map(item -> item.toUpperCase()).collect(Collectors.toList());
        list4.stream().forEach(item -> {
            System.out.println(item);
        });

在这里插入图片描述

三、利用stream().filter()对List进行过滤处理,并给另一个list赋值,并对其遍历

List<String> list = new ArrayList<String>();
list.add("list1");
list.add("list2");
list.add("list3");
list.add("list4");
List<String> list3 = new ArrayList<String>();
list3 = list.stream().filter(item -> !item.equals("list3")).collect(Collectors.toList());
list3.stream().forEach(item -> {
    System.out.println(item);
});

在这里插入图片描述

四、求某一个数列的最大值、最小值、和、平均值、数列元素数

List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        IntSummaryStatistics stat = list.stream().mapToInt((item) -> item).summaryStatistics();
        System.out.println("最大:" + stat.getMax());
        System.out.println("最小:" + stat.getMin());
        System.out.println("总和:" + stat.getSum());
        System.out.println("计数:" + stat.getCount());
        System.out.println("平均:" + stat.getAverage());

在这里插入图片描述
1)没有引入 Collectors.toMap()之前,对象集合转换代码非常臃肿,例:
1、首先我们有一个用户类 User
2、我们来初始化一个List数组:这样查询会让代码非常的臃肿
在这里插入图片描述
既然我们以 key 的方式去查找, List 集合转成 Map集合,存于Map中。这样操作起来就会显得更加的巧便
在这里插入图片描述
但是仍然会有些繁琐,上面代码我们将list通过遍历,将它转化为了一个map
3、在JAVA8中,我们可以利用 Java 8 stream 特性对集合进行操作,当我们引入Collectors.toMap()之后,代码将会大大简化
在这里插入图片描述
4、再了解下常用的 List 转 Map 的常见方式和一些注意事项:
4.1 List 转 Map,值为对象:

Map<String, User> map = users.stream().collect(Collectors.toMap(User::getUsername, u -> u));

4.2 List 转 Map,值为属性:

Map<String, Integer> map = users.stream().collect(Collectors.toMap(User::getUsername, User::getDeptType));

4.3 List 转 Map,值为属性,并且加工数据

Map<String, Integer> map = users.stream().collect(Collectors.toMap(u -> "List集合" + u.getUsername(), User::getDeptType))

4.4 注意 Map中的key是不能重复的,那么如果list集合被转换为map集合时,有多个key怎么办,下面我们把deptType 中key改为相同的运行一下会出现异常
在这里插入图片描述
那么如何避免这种key重复呢,可以使用Java 8 stream 新特性,stream API 中添加Lamda表达式在这里插入图片描述
(u1,u2) -> u1, 意思就是:map的key出现重复的时候,我们取第一个key和value作为基准,忽略相同的情况。
那接下来 覆盖原则 也基本是一样的 将(u1,u2) -> u2,已后面的key和value作为基准,自动覆盖之前值
在这里插入图片描述
当然也有小可爱会问,我俩全都要可以不可以,太可以了。可以根据值类型来连接。

Map<Integer, String> map = users.stream().collect(Collectors.toMap(User::getDeptType, User::getUsername, (u1, u2) -> u1 + "," + u2));

在这里插入图片描述
4.5 该说不说数据中经常会出现null的情况,那么遇到这种value为null的情况,怎么去避免呢
在这里插入图片描述
我们还是在此基础上做一些处理:避免为null的问题
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值