Java 8新特性-Stream运算

本文详细介绍了如何使用Java 8的Stream API对集合进行过滤(移除空字符串)、映射(计算平方)和高级聚合(连接字符串、计数非数字元素)。展示了Stream操作的链式编程风格和各种实用方法,如`filter`, `map`, `collect`, 和 `summaryStatistics`。
摘要由CSDN通过智能技术生成
	@Test
    void test(){
        List<String> strings = Arrays.asList("1234567","222333","a","","B");
        List<Integer> ints = Arrays.asList(1,2,3,10,0);

        /*Java 8之后在Collection接口中新增的方法
        * 允许以声明式的代码来处理数据
        * 使用stream方法将集合转为一个Stream实例*/
        Stream<String> stream = strings.stream();
        /*Stream中提供了一些方法来处理其中的数据
        * filter方法的参数是一个函数式接口,所以可以使用Lambda表达式
        * 将处理数据的逻辑写在其抽象方法中(该方法会返回一个boolean值),对其每个元素进行条件对比,
        * 如果返回值为true则保留,否则被过滤
        * 例如将其中的空字符串过滤掉,Java 8后的API支持链式编程
        * 使用collect方法来将Stream还原为指定类型的集合*/
        strings = stream.filter(s -> !s.isEmpty()).collect(Collectors.toList());
        System.out.println(strings);

        /*对其中元素做更改,使用map方法
        * 将其中元素更改为原来的平方*/
        Stream<Integer> stream1 = ints.stream();
        ints = stream1.map(i -> i*i).collect(Collectors.toList());
        System.out.println(ints);
        /*Tip:Stream的所有操作不会直接影响原集合中的元素*/


        /*collect方法的其他用法,这个方法什么效果,取决于传递的参数*/
        /*将当前Stream中的所有元素连接在一起并以指定字符串做为分隔
        * 要注意的是此Stream的泛型参数必须实现CharSequence接口,即他必须是一个字符序列
        * 若不是,则编译不通过,另外当调用此方法的Stream被操作或关闭则会抛出异常,如下
        */
//        stream.collect(Collectors.joining("")); 会报java.lang.IllegalStateException
        /*正确操作,获取新的Stream*/
        String s = strings.stream().collect(Collectors.joining("|"));
        System.out.println(s);

        /*高逼格操作:再次过滤,去除其中的纯数字字符串*/
        strings = strings.stream().filter(s1 -> Arrays.asList(s1.split(""))
                /*count方法:统计当前Stream中的元素数量*/
                .stream().filter( c -> c.charAt(0)<48||c.charAt(0)>57).count() !=0)
                .collect(Collectors.toList());
        /*好吧我承认用正则会更简洁
        * 那你为什么不用?
        * 不会,太繁琐,不想学,百度有现成的*/
        System.out.println(strings);

        /*其他的方法
        * distinct():去除重复元素,有序的Stream只保留索引最小的元素
        * sorted():对当前Stream中的元素进行自然排序
        * limit(long maxSize) : 截取到第maxSize个元素,maxSize若超过元素数量则会抛出异常
        * parallelStream() :由集合实例调用,创建一个并行流,即对流中操作时,对每个元素都会开启一个独立的线程
        *                   优点是效率较高,但较为消耗CPU资源,同时可能会出现一些并发问题
        * forEach(Lambda) : 用于遍历其中元素,用法等同与集合中的forEach()
        * mapToInt(..),mapToLong(..),mapToDouble(..) :会创建对应的数值流,前提是Stream的泛型要与之匹配
        * summaryStatistics():会返回一个结果收集器,此方法只能被数值流调用
        * 结果收集器中的方法有:
        *   getMax(),getMin(),getSum(),getAverage():获取 最大值,最小值,和,平均值(实际上数值流中也有对应功能的方法)
        *   combine(other):将同类型的other合并到自身中
        *   getCount():获取其中包含数值的个数
        */
        /*示例,使用结果收集器来获取其中的最大数值*/
        IntSummaryStatistics iss = ints.parallelStream()
                .distinct().mapToInt(i -> i)
                .summaryStatistics();
        int max= iss.getMax();
        System.out.println(max);

    }

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值