Stream

Stream

  • 创建Stream -> 中间操作 -> 终止操作
  • Stream是数据渠道,适用于数据源(集合,数组等)生成的元素序列
  • Stream 自己不会储存元素
  • Stream 不会改变源对象,相反,他们会返回一个持有结果的新Steam
  • Stream操作是延迟执行的,这表示他们会等到需要结果的时候才回去执行

使用流程

创建Stream

    // 创建Stream的几种方式
    @Test
    public void test1(){
        //1. 创建Stream   通过Collection 集合提供的stream()或 parallelStream()
        List<String> stringList = new ArrayList<>();
        Stream<String> stream1  = stringList.stream();
        //2. 通过Arrays 中的静态方法stream()获取Stream() 获取数组刘
        String[] strings = new String[5];
        Stream<String> stringStream = Arrays.stream(strings);
        //3. 通过Stream类中的of()方法
        Stream<String> stringStream1 = Stream.of("aa","bb","cc");
        //4. 创建无限流
        Stream<Integer> integerStream =Stream.iterate(0,(x) ->x+2);
        stream1.limit(10).forEach(System.out::println);
        //5. 生成
        Stream.generate(() -> Math.random())
                .limit(5)
                .forEach(System.out::println);
    }

中间操作

    // 中间操作-筛选与切片
    /*
     filter(Predicate p)
    接收 Lambda , 从流中排除某些元素。
    distinct()
    筛选,通过流所生成元素的 hashCode() 和 equals() 去 除重复元素
    limit(long maxSize)
    截断流,使其元素不超过给定数量。
    skip(long n)
    跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素 不足 n 个,则返回一个空流。与 limit(n) 互补
     */
    @Test
    public void test2(){
        List<String> strings = Arrays.asList(new String[]{"1", "2", "3", "1", "1"});
        // 过滤
        System.out.println("过滤");
        Stream<String> stringStream1 = strings.stream().filter((e) -> Integer.parseInt(e) > 1);
        stringStream1.forEach(System.out::println);
        // 限制
        System.out.println("限制");
        Stream<String> stringStream2 = strings.stream().limit(2);
        stringStream2.forEach(System.out::println);
        // 跳过
        System.out.println("跳过");
        Stream<String> stringStream3 = strings.stream().skip(3);
        stringStream3.forEach(System.out::println);
        // 去重
        System.out.println("去重");
        Stream<String> stringStream4 = strings.stream().distinct();
        stringStream4.forEach(System.out::println);
    }

    // 中间操作-映射
    /*
    map(Function f)
    接收一个函数作为参数,该函数会被应用到每个元 素上,并将其映射成一个新的元素。
    mapToDouble(ToDoubleFunction f)
    接收一个函数作为参数,该函数会被应用到每个元 素上,产生一个新的 DoubleStream。
    mapToInt(ToIntFunction f)
    接收一个函数作为参数,该函数会被应用到每个元 素上,产生一个新的 IntStream。
    mapToLong(ToLongFunction f)
    接收一个函数作为参数,该函数会被应用到每个元 素上,产生一个新的 LongStream。
    flatMap(Function f)
    接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
     */
    @Test
    public void test3(){
        List<String> strings = Arrays.asList(new String[]{"aaa", "bbb", "ccc", "aaa", "bbb"});
        // map
        System.out.println("map");
        strings.stream().map((e)->e.toUpperCase()).forEach(System.out::println);
        // map产生子流stream{stream,stream}
        System.out.println("map产生子流stream{stream,stream}");
        Stream<Stream<Character>> streamStream = strings.stream().map(Test1::getCharStream);
        streamStream.forEach((sm)->{sm.forEach(System.out::println);});
        // flatmap
        System.out.println("flatmap");
        strings.stream().flatMap(Test1::getCharStream).forEach(System.out::println);
    }
    public static Stream<Character> getCharStream(String str){
        List<Character> characterList = new ArrayList<>();
        for (Character c : str.toCharArray()) {
            characterList.add(c);
        }
        return characterList.stream();
    }

    // 中间操作-排序
    /*
    sorted()
    产生一个新流,其中按自然顺序排序
    sorted(Comparator comp)
    产生一个新流,其中按比较器顺序排序
     */
    @Test
    public void test4(){
        List<Integer> integers = Arrays.asList(new Integer[]{12, 95, -41, 36, 8});
        // 空参排序(默认从小到大)
        System.out.println("空参排序(默认从小到大)");
        integers.stream().sorted().forEach(System.out::println);
        // 自定义排序
        System.out.println("自定义排序");
        integers.stream().sorted((a,b)-> -Integer.compare(a,b)).forEach(System.out::println);
    }

###终止操作


    // 终止操作- 查找与匹配
    /*
    allMatch(Predicate p)
    检查是否匹配所有元素
    anyMatch(Predicate p)
    检查是否至少匹配一个元素
    noneMatch(Predicate p)
    检查是否没有匹配所有元素
    findFirst()
    返回第一个元素
    findAny()
    返回当前流中的任意元素
    count()
    返回流中元素总数
    max(Comparator c)
    返回流中最大值
    min(Comparator c)
    返回流中最小值
     */
    @Test
    public void test5(){
        List<Integer> integers = Arrays.asList(new Integer[]{12, 95, -41, 36, 8});
        // allMatch
        System.out.println("allMatch");
        System.out.println(integers.stream().allMatch((e) -> e.equals(12)));
        // anyMatch
        System.out.println("anymatch");
        System.out.println(integers.stream().anyMatch((e) -> e.equals(12)));
        // noneMatch
        System.out.println("noneMatch");
        System.out.println(integers.stream().anyMatch((e) -> e.equals(36)));
        // findFirst()
        System.out.println("findFirst");
        System.out.println(integers.stream().findFirst());
        // findAny()
        System.out.println("findAny");
        System.out.println(integers.stream().findAny());
        // count
        System.out.println("count");
        System.out.println(integers.stream().count());
        // max
        System.out.println("max");
        System.out.println(integers.stream().max(Integer::compareTo));
        // min
        System.out.println("min");
        System.out.println(integers.stream().min(Integer::compareTo));
    }

    // 归约
    /*
    reduce(T iden, BinaryOperator b)
    可以将流中元素反复结合起来,得到一个值。 返回 T
    reduce(BinaryOperator b)
    可以将流中元素反复结合起来,得到一个值。 返回 Optional<T>
     */
    @Test
    public void test6(){
        List<String> strings = Arrays.asList(new String[]{"aaa", "bbb", "ccc", "aaa", "bbb"});
        String str = strings.stream().reduce("",(x,y)->(x+y));
        System.out.println(str);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临水而愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值