Stream流的作用:
区别于IO流,Stream流是jdk1.8的新东西,用来对容器(集合,数组)操作进行书写简化,配合众多函数式接口以及lambda表达式,方法引用,集合的遍历,计数,过滤,映射,截取等操作变得异常优雅,上流。以往对集合的操作最简单的如遍历就是用for循环,函数式编程思想的引入,使得我们对这一遍历的实现操作有了新的认识,遍历取出每个元素是我们的目的,而for循环从1到最后取只是手段,在函数式编程注重行为而非过程的思想下,引入Stream流来简化对集合,数组的遍历等操作。
Stream流:
获取一个Stream流(一个)→中间方法(可多个)→终结方法(一个)
使用范围:
单列集合:集合对象.stream()
双列集合:不能直接获取,需间接获取
集合对象.keySet().stream()
集合对象.entrySet().stream()
两个返回的都是Set集合(单列)
数组:Arrays.stream(数组名) Arrays是数组的工具类
同种数据类型的多个数据:Stream.of(数据1,数据2,数据3...)
Stream.of(E... e) 参数为可变参数
中间方法:
stream<T> filter (Predicate p ) :过滤
Predicate接口 中的方法
boolean test(T t)对给定的参数进行判断,并返回布尔值(true留下,false不要)
理解:可以从匿名内部类
list.stream().filter(new Predicate<String>(){
@Override
public boolean test (String s){
boolean r = s.startWith("张");
return r;
}
})
------简写
list.stream().filter(s->s.startWith("张"));
其他常用中间方法:
Stream<T> limit(long maxSize) | 截取指定参数个数的数据(从第几个往前截取,后面不要) |
Stream<T> skip(long n) | 跳过指定参数个数的数据(从第几个往后开始截取,前面的不要) |
static<T> Stream<T> concat(Stream a , Stream b ) | 合并a和b为一个流 调用方式:Stream.concat(...) |
Stream<T> distinct() | 取出流中重复的元素,依赖hashcode和equals方法 |
结束方法:
void forEach(Consumer action) | 对此流的每一个元素执行操作 Consumer接口 方法 void accept(T t)对给定的参数执行此操作 |
long count() | 返回此流中的元素个数 |
注意:在Stream流中无法直接修改集合、数组等数据源中的数据
但可以对流进行收集操作
Stream流的收集操作:
R collect(Collector c)
工具类Collectors提供了具体的收集方法
public static<T> Collector toList() | 把元素收集到List集合中 |
public static<T> Collector toSet() | 把元素收集到Set集合中(不包含重复元素) |
public static Collector toMap(Function keyMapper, Function valueMapper) | 把元素收集到Map集合中 如何应用? |
list<String> s = list1.stream().filter(~).collect(collectors.toList());