集合排序,Lambda和Stream
集合排序
是指对一个集合中的元素按照特定的规则进行重新排列,已使得集合中的元素按照预定义的顺序实现
在集合排序中,这个规则决定集合中元素的排序的顺序
- 元素之间都得比较可以是数字的比价,字符串的字典序比较,对象的属性等
两大类:
- 使用集合排序的 API
- 使用支持自动排序的集合
Collections.sort()方法
void sort (List <T> list )
//对集合元素进行自然排序,(从小到大)
** Comparable接口**
在java中,如果要对元素进行排序,前提条件:该集合的元素必须是Comparable接口的实现类
该接口有一个比较大小的抽象方法compareTo
- 该接口表示其子类是可以比较的
- 所有的Comparable接口的实现类都需要重写compareTo的方法来定义对象间的比较规则
抽象方法 int compareTo(T t);
- 使当前的的对象与给定的对象进行比较
Comparator接口
核心方法是compare方法,用于比较两个数的大小,以及使用匿名内部类
它是可以在接口中定义具体实现的方法,
- reversed():该方法返回当前比较器的逆序比较器,它将原来的比较规则进行颠倒,使得升序变为降序,反之依然,
- thenComparing(Comparator<?super T>other):该方法返回一个组合比较器,用于对两个比较规则进项联合排序,
自动排序集合
1,树数据结构:树(tree)是一种常见的非线性数据结构,它由一组节点(Node)和节点 之间的链接关系(边 Edge)组成,
二叉搜索树
- 对于根节点,左子树中所有的节点的值 < 根节点的值 < 右子树所有节点的值
- 任意的左,右子树也是二叉搜索树
红黑树
是一种平衡二叉树,他可以在基础二叉树的基础上太耐额外的规则来平衡,
- 每个节点,要么是红色,要么是黑色
- 根节点是黑色
- 每个叶子结点(null节点)都是黑色
- 如果一个节点是黑色的,那么它的子节点都是黑色
- 每一条路劲上的黑色节点相同
TreeMap
在java中 TreeMap是一种实现了SortedMap接口的有序映射集合,基于红黑树的数据结构实现,
- 键的有序性:TreeMap中的键是有序的,
- 查找效率:由于红黑树是yi 种自平衡的二叉树,复杂度都是o(logn),n是映射中键值对的数量
- 允许null键:
TreeSet
TreeSet是一种实现了SortedSet接口的有序映射集合,不允许包含重复的元素
Lambda
它允许将代码块作为参数传递给方法作为返回值从方法中返回,Lambda表达式是一个匿名函数,它没有名称,但他可以像普通方法一样传递承参数并执行代码,
由于函数式接口只有一个抽象方法,可以用**@Funcationallnterface**注释标识他们,这个注释不是必须标注的注释
@Funcationallnterface
public interface MyFuncation(){
int apply(int x,imt y)
}
使用Lambda表达式
MyFuncation add=(a,b)->a+b;
int num=add.apply(5,6)
System.out.println(num);//num=11
语法:
(参数)->{主体}
简化代码:Lambda表达式可以让代码更简洁,减少了样板代码,使代码更易读
增加可读性:Lambda表达式可以使代码更易读和易懂,通过Lambda表达式可以将方法的逻辑和关键代码部分更加清晰地表达出来
提高可维护性:使用Lambda表达式可以减少代码中的重复性,使代码更易于维护
支持函数式编程:Lambda表达式支持函数式编程,可以方便地使用函数式接口进行函数组合,从而更加简洁地表达程序逻辑
并行编程支持:Lambda表达式可以支持并行编程,可以使用Java Stream API来处理大规模数据集合
提高性能:Lambda表达式的执行效率比传统的匿名内部类更高
函数引用
语法: 持有者::方法名
“持有者”可以是类或对象,“方法名”则根据具体情况分为4种。
函数引用可以分为以下四种类型:
• 静态方法引用:引用一个已有的静态方法,例如:Math::abs
• 实例方法引用:引用一个已有的实例类型方法,例如:String::length
• 对象方法引用:引用一个已有的实例对象方法,例如:out::println
• 构造函数引用:引用一个已有的构造函数(使用较少),例如:ArrayList::new
Stream API
方法:
filter:过滤流中的元素,只保留符合条件的元素
map:对流中的元素进行映射,将一个元素映射为另一个元素
flatMap:对流中的元素进行扁平化映射,将一个元素映射为多个元素
sorted:对流中的元素进行排序
distinct:去重,保留流中的不同元素
limit:限制流中元素的数量
skip:跳过流中的前N个元素
forEach:遍历流中的元素
reduce:对流中的元素进行归约,得到一个结果
collect:将流中的元素收集到一个集合中
min和max:找出流中的最小值和最大值
count:统计流中元素的数量
anyMatch、allMatch和noneMatch:判断流中的元素是否满足某个条件
findFirst和findAny:找到流中的第一个元素和任意一个元素
parallel和sequential:切换流的并行和串行模式
Stream API 优点
简化代码:Stream API 提供了许多函数式编程的方法,如 filter()、map()、reduce() 等,可以简化代码,提高代码可读性
并行处理:Stream API 支持并行处理,可以使用多个线程处理数据,提高了处理效率
惰性计算:Stream API 支持惰性计算,只有当需要结果时才进行计算,可以减少计算资源的浪费
支持处理无限数据:Stream API 支持处理无限数据流,如产生一个无限自然数序列
支持多种数据源:Stream API 支持处理多种数据源,如集合、数组、文件等
Stream API 缺点
性能问题:虽然 Stream API 支持并行处理,但并不是所有的场景都适合并行处理,可能会导致性能问题
可读性问题:虽然 Stream API 可以简化代码,但在某些情况下,可能会降低代码的可读性,使得代码更难理解和调试
不支持随机访问:Stream API 不支持随机访问,只能顺序访问,如果需要随机访问,需要转换为其他数据结构