赞
踩
Stream可以对集合数据进行操作,就类似使用SQL执行的数据查询。用于操作数据源(集合、数组等)所生成的元素序列。
Stream和Collection集合区别:Collection是一种静态的内存数据结构,而Stream是有关计算,前者主要面向内存,存储在内存中,后者主要是面向CPU,通过CPU实现计算。
注意:Stream自己不会存储元素;Stream不会改变原对象。相反,他们会返回一个持有结果的新stream;stream操作是延时执行的,他们会等到需要结果的时候才会执行。
创建stream:一个数据源,获取一个流。
中间操作:一个中间操作链,对数据源的数据进行处理
终止操作:一旦执行终止操作,就执行中间操作链,并产生结果。
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);
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理,而在终止操作时一次性全部处理,称为“惰性求值”。
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);
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());
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。