Java中的Stream

目录

一.特点

1.Stream和集合的区别

2.自己不会存储元素

3.不会改变源对象,且会返回一个新的Stream

4.延期执行,等结果出来才执行。

二.使用

1.实例化

2.Stream的中间操作

3.map()映射

4.排序

5.终止操作

6.归约

7.收集

8.Lambda表达式


一.特点

1.Stream和集合的区别

Stream 关注的是数据的运算 与cpu打交道;
集合关注的是数据的存储 和内存打交道;

2.自己不会存储元素

3.不会改变源对象,且会返回一个新的Stream

4.延期执行,等结果出来才执行。

二.使用

1.实例化

        List<Integer> aList= Arrays.asList(1,2,3,4);
//        1.通过集合
//        返回一个顺序流
        aList.stream();
//        返回一个并行流
        aList.parallelStream();
//        2.通过数组
        int [] arr  = new  int [5];
        Arrays.stream(arr);
//        3.通过of()
        Stream.of(1,22,33);
//        4.创建无限流
        Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);

    }

2.Stream的中间操作

        @Test
        public void test2(){

            List<Integer> aList= Arrays.asList(1,2,3,4,4);
        //        filter(predicate) 、接收Lambda 从流中排除某些元素
//            查询集合中>2的元素 344
            aList.stream().filter(e -> e>2).forEach(System.out::print);
//            limit(n)  给定元素不超过该数量
            System.out.println();
            aList.stream().limit(10).forEach(System.out::print);
//            stream 一旦执行中止操作 gai stream就不能使用 12344
//            skip(n) 跳过元素 返回一个扔掉了前n个元素的流 若流元素不足一个 则返回一个空流
            System.out.println();
            aList.stream().skip(1).forEach(System.out::print);//2344
//              distinct() 去重
            System.out.println();
            aList.stream().distinct().forEach(System.out::print);//1234


        }

3.map()映射

  @Test  
    public void test3(){

        List<Integer> aList1= Arrays.asList(1,2,3,4,4);
        List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
//        map(function f) 接收一个函数作为参数 将元素转换为其它形式或提取信息
        aList2.stream().map(str -> str.toUpperCase()).forEach(System.out::print); //AABBCCDDEE
        System.out.println();
        List<User> users = new   ArrayList<User>();
        users.add(new User(5));
        users.add(new User(6));
//        本来放的是user列表,映射完以后变成age列表
        Stream<Integer> integerStream = users.stream().map(User::getAge);
//        岁数>2
        integerStream.filter(a -> a>5).forEach(System.out::print);//6

//  flatMap 和 map  stream里面的stream 关系类似 add 和 addAll
    }

4.排序

    @Test
    public void test4(){

    List<Integer> aList1= Arrays.asList(1,2,3,4,4);
    List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
//        自然排序  实现Comparable接口
        aList2.stream().sorted().forEach(System.out::print);//aabbccddee
        System.out.println();
//        定制排序
      List<User> users = new   ArrayList<User>();
      users.add(new User(5));
      users.add(new User(6));
      users.stream().sorted(
              (o1,o2) -> Integer.compare(o1.getAge(),o2.getAge())
      ).forEach(System.out::println);
//        User{age=5}
//        User{age=6}

    }

5.终止操作

  @Test
    public void test5(){

        List<Integer> aList1= Arrays.asList(1,2,3,4,4);
        List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
        List<User> users = new   ArrayList<User>();
        users.add(new User(5));
        users.add(new User(6));
//      allMatch(predicate) 判断所有元素是否都满足此断言 anyMatch(predicate) 是否有一个满足 noneMatch(predicate) 是否没有
        aList1.stream().allMatch(a -> a>3 );
//        返回第一个元素 findFirst() ,findAny() 任意一个Optional(容器 解决空指针问题)
        Optional<Integer> first = aList1.stream().findFirst();
        System.out.println(first);
        //        返回任意一个元素 findAny() Optional(容器 解决空指针问题)
        Optional<Integer> findAny = aList1.stream().findAny();
        System.out.println(findAny);
        //        返回元素个数
        long count = aList1.stream().count();
        System.out.println(count);
        //        返回流中最大值 max(Comparator c)   最大值 min(Comparator c)
        Optional<Integer> max = users.stream().map(u -> u.getAge()).max(Integer::compare);
        System.out.println(max);
    }

6.归约

    @Test
    public void test6(){

        List<Integer> aList1= Arrays.asList(1,2,3,4,4);
        List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
        List<User> users = new   ArrayList<User>();
        users.add(new User(5));
        users.add(new User(6));
//reduce(T identity,BinaryOperator)  可以将流中的元素反复结合起来,得到一个值并返回
        Integer sum = aList1.stream().reduce(0, Integer::sum);//14
        System.out.println(sum);
//        int sum(int a, int b)  return a + b;
//        BiFunction<T,T,T>
//        求所有用户年龄的总和
        Integer sum1 = users.stream().map(User::getAge).reduce(0,Integer::sum);
//      爱能创造一切,也能毁灭一切。  认输可以输一半吗?
        System.out.println(sum1);
//       11
    }

7.收集

 @Test
    public void test7(){

        List<Integer> aList1= Arrays.asList(1,2,3,4,4);
        List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
        List<User> users = new   ArrayList<User>();
        users.add(new User(5));
        users.add(new User(6));
//    collect(Collector c) 将流转换为其它形式 接收一个Collector接口实现,用于给Stream中元素做汇总的方法

//        得到年龄>3的集合   Collectors.toList()
        Set<User> collect = users.stream().filter(e -> e.getAge()>3).collect(Collectors.toSet());
        collect.forEach(System.out::println);
//User{age=6}
//User{age=5}
    }

8.Lambda表达式

http://t.csdn.cn/k7ttC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值