1.获取方式
集合类型 | 默认方法 | 使用stream流方法 |
---|---|---|
单列集合 | default stream< E > stream() | collection中的默认方法 |
双列集合 | 无 | 无法使用stream流 |
数组 | public static < 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) | 获取流中的前 maxSize 个元素 |
stream<T> skip(long n) | 跳过流中的前 n 个元素 |
stream<T> distinct() | 去除流中的重复元素,依赖 hashCode 和 equals 方法 |
static <T> stream<T> concat(stream a, stream b) | 合并流 a 和流 b 为一个新的流 |
stream<T> map(Function<T, R> mapper) | 转换流中的元素类型 |
- 注意:
- 中间方法返回新的stream流,原来的stream流只能使用一次,建议使用链式编程
例:Stream < String > stream1 = list.stream().filter(s-> s.startwith(“张”)).forEach(s->sout(s));
-
修改stream流中的数据,不会影响原来集合或者数组中的数据
-
distinct方法的底层是重写hashcode和equals方法进行去重的
-
map方法的匿名内部类
例:
list.stream(new Function<String, Integer>(){
//第一个类型:流中原本的数据类型
//第二个类型:要转成之后的类型
@Override
public Integer apply(){
//apply的形参s:依次表示流里面的每一个数据
//返回值:表示转换之后的数值
return null;
}
})
//lambda链式编程
list.stream().map(s-> Integer.parseInt(s.split("-")[1]))
.forEach(s->sout(s));
3.stream流的终结方法
void forEach(Consumer action) 遍历
long count() 统计
toArray() 收集流中的数据,放到数组中
collect(Collector collector) 收集流中的数据,放到集合中
4.stream流中的收集方法Collect
Collectors方法
- tolist() 收集到list集合中
- toset() 收集到set集合中(hashset会去重)
- tomap(键的规则,值的规则)
tomap
- 参数一表示键的生成规则
- Function泛型一:表示流中每一个数据的类型
- Function泛型二:表示Map集合中键的数据类型
- 方法apply形参:依次表示流里面的每一个数据
- 方法体:生成键
- 返回值:已经生成的键
- 参数二表示值的生成规则
- Function泛型一:表示流中每一个数据的类型
- Function泛型二:表示Map集合中值的数据类型
- 方法apply形参:依次表示流里面的每一个数据
- 方法体:生成值
- 返回值:已经生成的值