Java中的Stream(流) API

JDK8开始,引入的Stream(流,自古牛逼皆入流嘛),它提供了一种声明式的方式来处理数据集合,例如筛选啊、排序啊、映射啊、聚合啊等等等等,都不需要程序员进行编写循环或者复杂的条件代码,或者繁琐代码。

注:同一个流,只能使用一次(是不是联想到 请求/响应流 了;其被设计为一次性使用的资源,一旦被读取或者写入,就无法在进行相同操作[是不是要说,那把流缓存起来不就可以重复使用了吗?这说的是一个事吗?])。

问题来了,

问题1:什么是声明式?(得恶补下)

        提到声明式编程(想想我们经常写的interface,就是主要表明意图嘛,而不是实现细节。总结:关注于描述“什么功能”),那就不得不提到命令式编程(实现interface的方法,方法里边的执行步骤,每一行明确的代码操作。总结:关注于描述“如何实现功能”)。[感觉好像大概就快懂了]

已知:

List<String> names = Arrays.asList("abaAba", "luoHen", "maMaMi", "chengXuYuan");

要求:找出元素,1)带小写字母a;2)进行首字母大写;3)进行升序;4)生成新的集合;

利用Stream API,实现如下:

List<String> upperOrderNames = names.stream().filter(name -> name.contains("a")).map(StrUtil::upperFirst).sorted().collect(Collectors.toList());//这里也可以直接使用.toList()进行生成新集合

      上边代码,是不是一目了然(每一块代码都能看出是“什么功能”,但具体实现看不出来吧)。看着是不是"流",就说够不够生动形象。 

同样的要求,用命令式编程试试(不了不了)。

。。。

问题2:哪些类可以使用stream()?

因为stream()是java.util.Collection接口的方法,所以,只要继承了java.util.Collection接口的类或接口,都可以使用该方法(这么说,靶向还是不够明确,其实只需要记住,所有实现了java.util.Set或者java.util.List接口的类就可以使用)。 

问题3:为什么只能使用一次?

来段直观的代码:

        List<Integer> numbers = Arrays.asList(2, 1, 5, 3, 4);
        // 创建一个Stream对象
        Stream<Integer> numberStream = numbers.stream();
        // 第一次遍历Stream
        List<Integer> firstTraversal = numberStream.sorted().toList();
        System.out.println(firstTraversal);
        // 第二次遍历同一个Stream对象
        List<Integer> secondTraversal = numberStream.toList();

运行报错:

其实Idea工具也会进行代码提示:

我就是要再利用怎么办?那你就再开个流嘛。

        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        // 创建一个Stream对象
        Stream<Integer> numberStream = numbers.stream();
        // 第一次遍历Stream
        List<Integer> firstTraversal = numberStream.sorted().toList();
        System.out.println(firstTraversal);
        // 重新创建一个Stream对象
        Stream<Integer> secondStream = numbers.stream();
        // 第二次遍历Stream
        List<Integer> secondTraversal = secondStream.toList();
        System.out.println(secondTraversal);

Stream中的方法分为中间操作(intermediate operation,均返回一个新的Stream,所以支持链式调用)终端操作(terminal operation,触发Stream的执行并产生结果),示例图参考如下,详细可自行查看Stream接口。

 

 

 接下来,就该考虑应用场景了吧,惯例(以下如果都ok,我感觉就差不多ok):

1)从集合中筛选出满足特定条件的元素;

2)将集合中的元素转换为另一种类型;

3)对集合中的元素进行排序

4)从集合中去除重复元素;

5)将流中的元素收集到新的集合中,如List、Set、Map等;

6)对集合中的元素进行聚合操作,如求和、求平均值等;

总的来说呢,Stream API为Java程序员提供了一种更加简洁高效的方式来处理集合数据,大大提高编程效率和代码质量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值