Lambda表达式
函数式接口
方法的引用
Stream流
Stream流中常见的操作
体验Stream流 "掌握"
问:
IO流跟Stream流有什么区别?
这两个知识点是完全不一样的东西。
IO流可以对本地的文件进行读写
Stream流可以对集合,数组,一堆数据进行操作。
Stream流的常见生成方式"掌握"
结论:
1.单列集合
List / Set
集合对象.stream();
2.双列集合
无法直接获取Stream流对象,需要间接获取
3.数组
Arrays.stream(数组);
案例:
int [] arr = {1,2,3,4,5};
Arrays.stream(arr).forEach(System.out::println);
4.一堆数据
Stream.of(1,2,3,4,5,6).forEach(System.out::println);
方法:
中间方法
调用完中间方法之后,还可以继续调用其他的中间方法或者终结方法。
终结方法
forEach count
当调用完终结方法之后,那么就不能再使用这个流了。
Stream的设计理念:
采取了流式布局。
在流中对数据进行操作,是不会影响集合中的数据的。
在流中的每一个步,是不保留数据的。当数据经过了第一步后,此时数据就到了第二步了。
第一步的流只能被调用一次,所以一般采取链式编程结构。
filter方法"掌握"
过滤:
把不满足条件的数据给过滤掉。
留下满足条件的数据
limit&skip
limit:获取前几个元素
skip:跳过前几个元素,获取剩余的元素。
案例:
1,2,3,4,5,6,7,8,9,10.
我想获取 4 - 6
思路1:
第一步:先跳过前3个元素,获取 4,5,6,7,8,9,10.
第二步:再获取前3个元素,得到 4,5,6
思路2:
第一步:先获取前6个元素,获取 1,2,3,4,5,6
第二步:再跳过前3个元素,获取剩余的 4,5,6
代码案例:
跳过 获取前3个
Stream.of(1,2,3,4,5,6,7,8,9,10).skip(3).limit(3).forEach(System.out::println);
获取前6个 跳过
Stream.of(1,2,3,4,5,6,7,8,9,10).limit(6). skip(3).forEach(System.out::println);
concat&distinct
concat:就是把两个流中的数据合在一起。
distinct:去重。
依赖的是hashcode和equals方法。
注意点:
如果此时容器中装的是自定义对象,那么必须重写hashcode和equals方法。
总结:
什么时候需要重写hashcode和equals?
a,要往 HashSet 里面存自定义对象的时候。
b,要往 LinkedHashSet 里面存自定义对象的时候。
c,要往 HashMap 的键位置存自定义对象的时候。
d,要往 LinkedHashMap 的键位置存自定义对象的时候。
e,Stream流中的distinct方法也需要重写。
f,两个对象要进行元素的比较时。//自动登录小案例
g,集合的contains方法底层是依赖equals方法来确定是否包含的。
h,集合的indexOf方法底层是依赖equals方法来确定索引位置的。
i,集合的remove(对象)方法底层是依赖equals方法来确定是否需要删除的。
sorted
功能:
排序。
sorted(): 空参依赖的排序规则是自然排序。
sorted(比较器对象): 带参依赖的排序规则是比较器中的规则
总结:
什么时候需要指定规则?
“只要是排序的时候都需要指定规则。”
a,TreeSet 存储自定义对象时
b,TreeMap 的键位置存储自定义对象时
c,List集合中的sort方法
d,Collections中的sort方法
e,Stream流中的sorted方法
map&mapToInt
map:底层依赖的是Function接口
是为了执行一段代码。
可以把A类型变成B类型
//“123” —> 123
//new Student(“zhangsan”,23); —> “zhangsan”
//123 —> “123”
mapToInt: 就是为了把A类型变成 int 类型
例:
forEach&count
forEach:就是遍历流中的数据。
count : 就是统计流中还剩下多少个数据。
注意点:返回值是long类型。
注意点:
这两个都是终结方法。当调用完这两个方法后,不能再次调用流中的其他数据。
Stream流的收集操作
因为Stream流不保留数据。也不能对集合中的数据进行修改。
如何我现在有一个需求,想要保留我操作完毕之后的数据,改怎么办?
目的:
就是把流中的数据放到集合中保存。