Java8集合List排序、筛选、求和、求最大值、平均值、List转Map

强烈推荐先看这篇 Java8 Stream(1)详细总结目录

强烈推荐先看这篇 Java8 Stream(1)详细总结目录

强烈推荐先看这篇 Java8 Stream(1)详细总结目录

我的另一篇博客 Java8 Lambda操作集合总结

如果本文对您有帮助,就点个赞👍吧

1. List

  • 元素有序
  • 元素可重复

1.1 ArrayList

  • 动态数组实现
  • 查询快
  • 增删慢(末尾处也快)

1.2 LinkedList

  • 链表实现
  • 查询慢
  • 增删快

1.3 ArrayList和LinkedList比较

实现查询增删线程安全?
ArrayList动态数组慢(末尾处也快)不安全
LinkedList链表不安全

ArrayList:
它的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍。

LinkedList:
底层实现是双向链表。
在增加和删除元素时效率较高。

1.4 List过滤指定元素

1.4.1 准备待测试的List

public class Message {
    private Long id;    //id

    private String msg; //消息

    private Date sendTime;  //时间戳
    //省略get set
}
//返回一个List
private static List<Message> getMessageList(){
        List<Message> list = new ArrayList<>();
        list.add(new Message(1L, "a", new Date()));
        list.add(new Message(2L, "b", new Date()));
        list.add(new Message(4L, "b", new Date()));
        list.add(new Message(3L, "c", new Date()));
        return list;
    }

1.4.2 使用Iterator遍历List

 private static void TestArrayList(){
        List<Message> list = getMessageList();
        System.out.print("删除前:");
        list.stream().forEach(item -> System.out.print(item));

        Iterator<Message> it = list.iterator();
        while (it.hasNext()) {
            Message s = it.next();
            if (s.getMsg().equals("b")) {
                it.remove();
            }
        }

        System.out.print("\n删除后:");
        list.stream().forEach(item -> System.out.print(item));
}

1.4.2 使用Java8对List过滤筛选

private static void filterList(){
    List<Message> list1 = getMessageList();
    //过滤所有msg是b的记录
    List<Message> list2 = list1.stream().filter(s -> !s.getMsg().equals("b")).collect(Collectors.toList());
    list2.stream().forEach(item -> System.out.println(item));
}

1.4.3 使用distinct去重

//使用distinct去重
List<String> distinctMsg = list.stream().map(Message::getMsg).distinct().collect(Collectors.toList());
distinctMsg.forEach(System.out::println);

1.4.4 使用toSet去重

//使用collect(toSet())去重
Set<String> distinctMsg2 = list.stream().map(Message::getMsg).collect(toSet());
distinctMsg2.forEach(System.out::println);

1.5 使用Java8对List排序

1.5.1 单个字段排序

   private static void sortList(){
        List<Message> list = getMessageList();
        if (list != null && !list.isEmpty()){
            System.out.println("===排序前如下===");
            list.stream().forEach(item -> System.out.println(item));

            //根据Id升序排序
            list.sort((a, b) -> a.getId().compareTo(b.getId()));

            //根据Id升序排序(简写)
            list.sort(Comparator.comparing(Message::getId));

            //根据Id降序排序(简写)
            list.sort(Comparator.comparing(Message::getId).reversed());
            
            System.out.println("===排序后如下===");
            list.stream().forEach(item -> System.out.println(item));
        }
    }

1.5.2 多个字段组合排序

private static void sortList(){
    List<Message> list = getMessageList();
    if (list != null && !list.isEmpty()){
        System.out.println("===排序前如下===");
        list.stream().forEach(item -> System.out.println(item));

        //根据多条件组合排序,先根据msg(升序),再根据id(升序)
        list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Message::getId));

        //根据多条件组合排序,先根据msg(升序),再根据id(降序)
        list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Comparator.comparing(Message::getId).reversed()));

        //根据多条件组合排序,先根据msg(降序),再根据id(降序)
        list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Message::getId).reversed());

        //根据多条件组合排序,先根据msg(降序),再根据id(升序)
        list.sort(Comparator.comparing(Message:: getMsg).reversed().thenComparing(Message::getId));

        System.out.println("===排序后如下===");
        list.stream().forEach(item -> System.out.println(item));
    }
}

1.6 List<T>转List<Object>

 List<Long> idList = 
 list.stream().map(Message::getId).collect(Collectors.toList());

1.6.1 List<T>转List<Object> +去重

//利用distinct()
List<String> msgList = 
list.stream().map(Message::getMsg).distinct().collect(Collectors.toList());

//利用Collectors.toSet()
Set<String> msgList2 = 
list.stream().map(Message::getMsg).collect(Collectors.toSet());

1.7 List<T>转Map<String, T>

还是上面的测试数据,按Message的msg作为key,如果key重复就用第一个.

 private static void listToMap(){
    List<Message> list = getMessageList();
    Map<String, Message> map = 
    	list.stream().collect(Collectors.toMap(Message :: getMsg, a-> a, (k1, k2) -> k1));
    System.out.println(map.size());
}

原本List有4个元素,因为有2条msg="b"的数据,转map后取第一条
在这里插入图片描述

1.7.1 forEach遍历Map

        map.forEach((k,v) -> {
            System.out.println(k + " -> " + v);
        });

1.8 List<T>转Map<String, List<T>>

Map<String, List<Message>> groupByMsg = list.stream().collect(groupingBy(Message::getMsg));

groupByMsg.forEach((k, v) -> {
     System.out.println(k + " -> " + v.toString());
});

返回如下:

a -> [Message(id=1, msg=a, sendTime=Fri May 15 17:36:30 CST 2020)]
b -> [Message(id=2, msg=b, sendTime=Fri May 15 17:36:30 CST 2020), Message(id=4, msg=b, sendTime=Fri May 15 17:36:30 CST 2020)]
c -> [Message(id=3, msg=c, sendTime=Fri May 15 17:36:30 CST 2020)]

1.9 List<Map<String, Object>>转Map<String, List<Map<String, Object>>>

Map<String, List<Map<String, Object>>> groupByGenderMap = 
pigMapList.stream().collect(groupingBy(e -> e.get("gender").toString()));

1.10 List求和、求最大值、平均值

private static void statisticsList(){
        List<Message> list = getMessageList();
        //求和
        Long sum= list.stream().mapToLong(Message::getId).sum();
        System.out.println("sum = " + sum);

        //求最大值
        Optional<Message> maxMassage = list.stream().collect(Collectors.maxBy(Comparator.comparing(Message::getId)));
        Long maxId = maxMassage.get().getId();
        System.out.println("maxId = " + maxId);


        LongSummaryStatistics lss = list.stream().collect(Collectors.summarizingLong(Message::getId));
        System.out.println("sum = " + lss.getSum());
        System.out.println("max = " + lss.getMax());
        System.out.println("min = " + lss.getMin());
        System.out.println("avg = " + lss.getAverage());
}

如果本文对您有帮助,就点个赞👍吧

  • 18
    点赞
  • 55
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

亚瑟弹琴

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值