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

我的另一篇博客Java8 lambda整理
我的另一篇博客Java8 Lambda操作集合总结
我的另一篇博客Java8 Stream 集合 List Map 相互转换

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

Java8集合List排序、筛选

  • 1. List
    • 1.1 ArrayList
    • 1.2 LinkedList
    • 1.3 ArrayList和LinkedList比较
    • 1.4 List过滤指定元素
      • 1.4.1 准备待测试的List
      • 1.4.2 使用Iterator遍历List
      • 1.4.2 使用Java8对List过滤筛选
      • 1.4.3 使用distinct去重
      • 1.4.4 使用toSet去重
    • 1.5 使用Java8对List排序
      • 1.5.1 单个字段排序
      • 1.5.2 多个字段组合排序
    • 1.6 List转List
      • 1.6.1 List转List +去重
      • 1.7 List转Map
        • 1.7.1 forEach遍历Map
      • 1.8 List转Map>
      • 1.9 List>转Map>>
      • 1.10 List求和、求最大值、平均值
      • 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转List
         List<Long> idList = 
         list.stream().map(Message::getId).collect(Collectors.toList());
        

        1.6.1 List转List +去重
        //利用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转Map

        还是上面的测试数据,按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转Map>

        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>>

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

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

        你可能感兴趣的:(Java)