不可变集合
- 创建不可变集合的应用场景
- 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的选择
- 当集合对象被不可信的库被调用时,不可变形式是安全的。(简单理解:不想让别人修改集合中的内容)
- 创建不可变集合的书写格式
- 在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合
方法名称 | 说明 |
static <E> List<E> of(E..elements) | 创建一个具有指定元素的List集合对象 |
static <E> Set<E> of(E...elements) | 创建一个具有指定元素的Set集合对象 |
static <K,V> Map<K,V> of(E..elements) | 创建一个具有指定元素的Map集合对象 |
注意:这个集合不能添加、删除、修改。创建Set集合是,要保证集合里面的数据不重复。
创建Map集合时:
- 键不能重复、
- Map里面的of方法,参数是有上限的,最多只能传递20个参数,10个键值对
- 如果我们要传递多个键值对对象,数量大于10个
- 创建普通的Map集合
- 利用创建好的Map集合获取一个不可变对象的集合
// 创建一个Map集合 Map<String,String> m = new HashMap<>(); // 利用上面的数据来获取一个不可变集合 // 获取到所有的键值对对象(Entry对象) Set<Map.Entry<String,String>> entries = m.entrySet(); // 把entries变成一个数组 // 如果集合的长度 > 数组的长度:数据在数组中放不下,此时会根据实际数据的个数,重新创建数组 // 如果集合的长度 < 数组的长度,数据在数组中放得下,此时不会创建新的数据,而是直接用 Map.Entry[] arr = entries.toArray(new Map.Entry[0]); // 不可变的Map集合 Map map = Map.ofEntries(arr);
- 用Map.copyOf(要变为不可变集合的集合)来创建一个新的不可变集合(JDK必须大于等于10才可以使用)
Stream流
Stream流的作用
结合了Lambda表达式,简化集合、数组的操作
Stream流的使用步骤
1.先得到一条Stream流(流水线),并把数据放上去
获取方式 | 方法名 | 说明 |
单列集合 | default Stream<E> stream() | Collection中的默认方法 |
双列集合 | 无 | 无法直接使用Stream流 |
数组 | public static <T> Stream<T> stream(T[] array) | Arrays工具类中的静态方法 |
一堆零散数据 | public static <T> Stream<T> of(T...values) | Stream接口中的静态方法 |
Stream接口中静态方法of细节:方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组,但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中。
2.使用中间方法对流水线上的数据进行操作
名称 | 说明 |
Stream<T> filter(Predicate<? super T> predicate) | 过滤 |
Stream<T> limit(long maxSize) | 获取前几个元素 |
Stream<T> skip(long n) | 跳过前几个元素 |
Stream<T> distinct() | 元素去重,依赖(hashCode和equals方法) |
static <T> Stream<T> concat(Stream a,Stream b) | 合并a和b两个流为一个流 |
Stream<R> map(FUnction<T,R> mapper) | 转换流中的数据类型 |
注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程注意2:修改Stream流中的数据,不会影响原来集合或数组中的数据
3.使用终结方法对流水线上的数据进行操作,
名称 | 说明 |
void forEach(Consumer action) | 遍历 |
long count() | 统计 |
toArray() | 收集流中的数据,放到数组中 |
collect(Collector collector) | 收集流中的数据,放到集合中 |
toArray方法的参数作用:负责创建一个指定类型的数组。底层:会依次得到流里面的每一个数据,并把数据放到数组中。返回值:是一个装着流里面所有数据的数组
collect中toMap:参数一表示键的生成规则
参数二表示值的生成规则
参数一:
Function泛型一:表示流中每一个数据的类型
泛型二:表示Map集合中键的数据类型
方法apply形参:依次表示流里面的每一个数据
方法体:生成键的代码
返回值:已经生成的键
参数二:
Function泛型一:表示流中每一个数据的类型
泛型二:表示Map集合中值的数据类型
方法apply形参:依次表示流里面的每一个数据
方法体:生成值的代码
返回值:已经生成的值
收集到Map集合键不能重复