一、概念
1、基本概念
Stream可以对集合数据进行操作,就类似使用SQL执行的数据查询。用于操作数据源(集合、数组等)所生成的元素序列。
Stream和Collection集合区别:Collection是一种静态的内存数据结构,而Stream是有关计算,前者主要面向内存,存储在内存中,后者主要是面向CPU,通过CPU实现计算。
注意:Stream自己不会存储元素;Stream不会改变原对象。相反,他们会返回一个持有结果的新stream;stream操作是延时执行的,他们会等到需要结果的时候才会执行。
2、操作步骤
创建stream:一个数据源,获取一个流。
中间操作:一个中间操作链,对数据源的数据进行处理
终止操作:一旦执行终止操作,就执行中间操作链,并产生结果。
二、具体操作
1、创建
1、集合创建
List<String> list=new ArrayList<>();
//顺序流
list.stream();
//并行流
list.parallelStream();
2、数组创建(利用工具类Arrays)
int[] i={1,2,3};
Arrays.stream(i);
3、通过Stream.of方法
Stream<Integer> integerStream = Stream.of(1, 2, 3);
4、通过无限流
//迭代
Stream.iterate(0,t->t+2).limit(5).forEach(System.out::println);
//生成
Stream.generate(Math::random).limit(5).forEach(System.out::println);
2、中间操作
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理,而在终止操作时一次性全部处理,称为“惰性求值”。
1、筛选与切片
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(5);
list.add(1);
//过滤器 打印:3 5 1
list.stream().filter(i->i>2).forEach(System.out::println);
//去重 打印:1 2 3 5
list.stream().distinct().forEach(System.out::println);
//limit 打印:1 2
list.stream().limit(2).forEach(System.out::println);
//跳过元素 打印:3 5 1
list.stream().skip(2).forEach(System.out::println);
2、映射
3、排序
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(5);
list.add(1);
//sorted 打印:1 1 2 3 5
list.stream().sorted().forEach(System.out::println);
//Sorted
List<User> users=new ArrayList<>();
users.add(new User(1,"11",20,1));
users.add(new User(2,"222",22,0));
users.add(new User(3,"33",23,1));
users.add(new User(4,"44",20,0));
users.stream().sorted((a,b)->{
int i=Integer.compare(a.getAge(),b.getAge());
if(i==0){
return Integer.compare(a.getSex(),b.getSex());
}else {
return i;
}
}).forEach(System.out::println);
3、终止操作
1、匹配与查找
List<User> users=new ArrayList<>();
users.add(new User(1,"11",20,1));
users.add(new User(2,"222",22,0));
users.add(new User(3,"33",23,1));
users.add(new User(4,"44",20,0));
//allMatch 打印:false
boolean b = users.stream().allMatch(u -> u.getAge() > 20);
System.out.println(b);
//anyMatch 打印:true
boolean c = users.stream().anyMatch(u -> u.getAge() > 20);
System.out.println(c);
//noneMatch 打印:false
boolean d = users.stream().noneMatch(u -> u.getAge() > 20);
System.out.println(d);
//findFirst 打印:第一个元素
System.out.println(users.stream().findFirst());
//findAny 打印:随机元素(并行流会,串行流可能不会)
System.out.println(users.parallelStream().findAny());
//count 打印:元素总数
System.out.println(users.stream().count());
//最大
System.out.println(users.stream().max((a,f)->Integer.compare(a.getAge(),f.getAge())));
//最小
System.out.println(users.stream().min((a,f)->Integer.compare(a.getAge(),f.getAge())));
2、规约
List<User> users=new ArrayList<>();
users.add(new User(1,"11",20,1));
users.add(new User(2,"222",22,0));
users.add(new User(3,"33",23,1));
users.add(new User(4,"44",20,0));
//reduce
List<Integer> nums= Arrays.asList(1, 2, 3, 4, 5);
Integer reduce = nums.stream().reduce(0, Integer::sum);
System.out.println(reduce);
//计算user年龄
Stream<Integer> integerStream = users.stream().map(user -> user.getAge());
System.out.println(integerStream.reduce(Integer::sum));
3、收集
List<User> users=new ArrayList<>();
users.add(new User(1,"11",20,1));
users.add(new User(2,"222",22,0));
users.add(new User(3,"33",23,1));
users.add(new User(4,"44",20,0));
//年龄大于20的转换为list
List<User> collectList = users.stream().filter(u -> u.getAge() > 20).collect(Collectors.toList());
//年龄大于20的转换为set
Set<User> collectSet = users.stream().filter(u -> u.getAge() > 20).collect(Collectors.toSet());