Java8集合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;  //idprivate 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 使用toSet去重

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

1.4.3 使用distinct去重

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

1.5 使用Java8对List排序

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

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

  1. Golang——切片使用大全(创建、初始化、遍历、截取、修改、添加、切片的copy、切片作为函数参数、切片求和、切片求最大值)

    概念: 切片出现的原因也是因为数组的可操作性不高.切片的长度是不固定的,可以追加数据,可以理解切片是一个动态数组,切片的底层是一个结构体 切片类型(slice)本身并不是动态数组或数组指针.它内部通过 ...

  2. (1~2):C实现数组求和,求平均值,求最大值,最小值

    1.求和.求平均值 #include<stdio.h>int main() {int arr[5]={1,2,3,4,5};int sum=0;for(int i=0;i<5;i++ ...

  3. 数组求和,求平均数,求最大值和最小值

    1.定义数组 var arr=[]; var arr=new Array(); 2.数组赋值 var arr=[]; arr[0]=10;//把数字10赋值到数组索引为0的位置上 arr[1]=20; ...

  4. python 二维列表按列求和,按列求最大值,转置,* 星号操作,简便方法,不使用numpy

    python3中,二维列表(矩阵)按列求和.求最大值.二维列表转置的一些操作,不使用numpy库.在LeetCode做题时比较常用. 太长不看版本 # 用于演示的二维列表 >>>a ...

  5. Eratosthenes集合筛选法求素数

    Eratosthenes集合筛选法求素数 算法思想 和数因子,和数因子是从素数中产生的,最小的素数为2,m作为合数因子,从2开始,配合k+=m,删除合数因子的倍数,当m不断扩大时,如当m为5的时候,上 ...

  6. python使用集合实现筛选法求素数-python素数筛选法浅析

    原理: 素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.在加密应用中起重要的位置,比如广为人知的RSA算法中,就是基于大整数的因式分解难题,寻找两个超大的素数然后相乘作 ...

  7. Java8 Stream 分页-多字段排序-筛选

    分页 list.stream().skip((page-1)*limit).limit(limit).collect(Collectors.toList()) 筛选 Set<String> ...

  8. Java8 Stream-深入理解筛选、归约、分组、聚合

    文章目录 1. 什么是stream? 2. 如何创建stream? 2.1 空的流 2.2 集合的流 2.3 数组的流 2.4 Stream.builder() 2.5 Stream.generate ...

  9. java8 集合结合steam操作实例

    java8 集合结合steam操作实例 集合框架介绍:https://www.runoob.com/java/java-collections.html java8-streams:https://w ...

最新文章

  1. 天昊Accu16S细菌绝对定量测序项目登陆顶级环境杂志《Journal of Hazardous Materials》...
  2. 一线上nagios监控参数
  3. 第三次学JAVA再学不好就吃翔(part32)--方法重写
  4. 运动基元_发现大量Java基元集合处理
  5. [android] AndroidManifest.xml - 【 manifest - permission】
  6. 高性能HTTP加速器Varnish(管理维护篇)
  7. 计算机学情分析,中职学生的学情分析 《计算机专业》.doc
  8. 一个双线程下同一时候操作指针变量导致野指针出现的问题总结
  9. 提前防止Non-PIE错误,检测app是否包含PIE标志
  10. 程序员必读的三十本经典书籍
  11. Mac:彻底卸载MySQL
  12. 熄风的止颤的汤治疗帕金森的优势
  13. 为什么使用multiarmed bandit algorithms(多臂赌博机算法)--与A/Btest的对比
  14. IOS-升级102 全局监听SendEvent
  15. 微信闪退的修复方法分享
  16. 财报解读:硬件支撑思科增长,云平台何时能突围?
  17. 【加密技术】Java加密算法
  18. 酷我音乐歌手写真接口分享
  19. 数字同步网络时钟系统设计方案
  20. Python——pandas模块—Series数据结构

热门文章

  1. MySQL5.7主从数据库复制(Win10)
  2. 老男孩培训班shell考核的几个题
  3. 计算机领域当前的主流技术及其社会需求调查报告
  4. iOS动画效果、绘制图形
  5. The Origin
  6. 群晖DS918+在esxi7.0下的安装
  7. 如何设置在Apple Watch上优化的电池充电
  8. List集合转换成xml格式
  9. 教育APP开发的流程
  10. Java实现第九届蓝桥杯字母阵列