Java8新特性---StreamAPI

一、概念

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());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值