9 Java数据结构(下):集合进阶之Map(双列集合)系列、不可变集合、操作集合的Stream流:Map接口、HashMap实现类、LinkedHashMap实现类、TreeMap实现类9
文章目录
- 前言
- 一、 Map(双列集合)接口
- 三、 不可变集合
- 四、Stream流(适用于单列集合、双列集合、数组、一堆零散的数据)
- 1 Stream流是什么?
- (1)从一个简单的例子出发初体验stream流
- (2)stream流的思想
- 2 Stream的使用
- (1)获取Stream流
- ---- 单列集合:default Stream\<E> stream() | collection中的默认方法
- ---- 双列集合:无法直接使用stream流(只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流)
- ---- 数组:public static \<T> Stream\<T> stream(T[]array) | Arrays工具类中的静态方法
- ---- 一堆零散的数据(要求是同种数据类型):public static\<T> Stream\<T> of(T... values) | Stream接口中的静态方法
- (2)Stream流的中间方法
- ---- 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) :将流中的每个元素映射到另一个值,常用于进行转换流中的数据类型(常用!!!!!!!!!!)
- ---- Stream\<T> sorted() :排序
- ---- Stream\<T> sorted(Comparator\<? super T> comparator):按指定规则排序
- (3)Stream流的终结方法
- ---- void forEach(Consumer\<? super T> action) :遍历流中的数据
- ---- A[] toArray(IntFunction\<A[]> generator) :返回流中的数据组成的数组(常用!!!!!!)
- ---- R collect(Collector\<? super T, A, R> collector) :返回流中的数据组成的集合(返回值是List、Set、Map系列)(常用!!!!!!!!!)
- ---- Optional\<T> max(Comparator\<? super T> comparator):返回流中最大的元素的 Optional对象
- ---- Optional\<T> min(Comparator\<? super T> comparator):返回流中最小的元素的 Optional对象
- ---- long count() :返回流中元素个数
- ---- Optional\<T> reduce(BinaryOperator\<T> accumulator) | 将流中的元素反复结合起来,得到一个值
- 3 Stream的一些小练习
前言
一、 Map(双列集合)接口
三、 不可变集合
四、Stream流(适用于单列集合、双列集合、数组、一堆零散的数据)
1 Stream流是什么?
(1)从一个简单的例子出发初体验stream流
要了解什么是Stream流,从一个实际例子出发:
先看一下如果用我们以前的知识这个需求代码是怎么写的:
ArrayList<String>list=newArrayList<>();list.add("张无忌");list.add("张三丰");list.add("周芷若");list.add("赵敏");list.add("张强");// 1 把所有以“张”开头的元素存储到一个新的集合中ArrayList<String>list2=newArrayList<>();for(Strings:list){if(s.startsWith("张")){list2.add(s);}}System.out.println(list2);// [张无忌, 张三丰, 张强]// 2 把以“张”开头的所有长度为3的元素存储到一个新的集合中ArrayList<String>list3=newArrayList<>();for(Strings:list2){if(s.length()==3){list3.add(s);}}System.out.println(list3);// [张无忌, 张三丰]// 3 遍历打印最终结果list3.forEach(s->System.out.println(s));// 张无忌 张三丰可以看到,还是很繁琐的。
但是如果采用集合的Stream流写法
ArrayList<String>list=newArrayList<>();list.add("张无忌");list.add("张三丰");list.add("周芷若");list.add("赵敏");list.add("张强");// 筛选出以“张”开头并且长度为3的字符串// 遍历打印最终结果list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(System.out::println);// 张无忌 张三丰这下应该明白什么是集合的stream流了吧,理解成一个通道,没经过这个通道一部分就会进行一些操作。
我们学校stream流就是要学习在这个通道里面的一些常见操作。
(2)stream流的思想
就像一台流水线一样,在流水线上进行对商品(数据)进行各种处理。结合了Lambda表达式,简化集合、数组的操作
这个流水线上的各种操作分为:
- 中间方法:过滤、转换等
方法调用完毕后还可以调用其他方法 - 终结方法:统计、打印等
最后一步,调用完毕后不能再调用其他方法
2 Stream的使用
要了解其怎么使用,就必须知道使用中有哪些步骤:
Stream流的使用步骤:
- step1: 先得到一条Stream流(流水线),并把数据放上去
- step2: 使用中间方法对流水线上的数据进行操作
- step3: 使用终结方法对流水线上的数据进行操作
下面我们就对这几个步骤挨个进行学习。
(1)获取Stream流
根据数据类型是单列集合、双列集合、数组、一堆零散的数据的不同情况提供了不同的方法调用。
| 获取方式 | 方法名 | 说明 |
|---|---|---|
| 单列集合 | default Stream<E> stream() | collection中的默认方法 |
| 双列集合 | 无 | 无法直接使用stream流(只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流) |
| 数组 | public static <T> Stream<T> stream(T[]array) | Arrays工具类中的静态方法 |
| 一堆零散的数据(需要是同种数据类型) | public static<T> Stream<T> of(T… values) | Stream接口中的静态方法 |
由于,需要演示,我们提前使用终结方法里面的forEach()方法,其实就和之前的集合遍历差不多
---- 单列集合:default Stream<E> stream() | collection中的默认方法
单列集合 default Stream<E> stream() : collection中的默认方法
ArrayList<String>list=newArrayList<>();Collections.addAll(list,"a","b","c","d","e","f","g","h","i","j");// 1 获取到一条Stream流水线/* // 复杂写法 Stream<String> stream = list.stream(); stream.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); // 这个里面 s 就是流水线中的每一个元素 } });*/// 简化写法list.stream().forEach(s->System.out.println(s));// a b c d e f g h i j---- 双列集合:无法直接使用stream流(只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流)
无法直接使用stream流,只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流
HashMap<String,Integer>map=newHashMap();map.put("aaa",111);map.put("bbb",222);map.put("ccc",333);map.put("ddd",444);// stream()流 keySet()方法map.keySet().stream().forEach(s->System.out.println(s));// aaa bbb ccc ddd// stream()流 entrySet()方法 里面每一个元素是一个Map.Entry对象map.entrySet().stream().forEach(entry->System.out.println(entry.getKey()+" : "+entry.getValue()));/*aaa : 111 ccc : 333 bbb : 222 ddd : 444*/---- 数组:public static <T> Stream<T> stream(T[]array) | Arrays工具类中的静态方法
public static <T> Stream<T> stream(T[]array) :Arrays工具类中的静态方法
String[]arr={"a","b","c","d","e"};// 数组使用Arrays里面的静态方法stream()方法获取Stream流Arrays.stream(arr).forEach(s->System.out.println(s));// a b c d e---- 一堆零散的数据(要求是同种数据类型):public static<T> Stream<T> of(T… values) | Stream接口中的静态方法
public static<T> Stream<T> of(T… values) :Stream接口中的静态方法
Stream.of(1,2