Java Stream函数式编程第三篇:管道流结果处理

通过Collectors.toSet()方法收集Stream的处理结果,将所有元素收集到Set集合中。




Set<String> collectToSet = Stream.of(

   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"

) 

.collect(Collectors.toSet());



//最终collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set会去重。



3.2.收集到List

同样,可以将元素收集到List使用toList()收集器中。




List<String> collectToList = Stream.of(

   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"

).collect(Collectors.toList());



// 最终collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]



3.3.通用的收集方式

上面为大家介绍的元素收集方式,都是专用的。比如使用Collectors.toSet()收集为Set类型集合;使用Collectors.toList()收集为List类型集合。那么,有没有一种比较通用的数据元素收集方式,将数据收集为任意的Collection接口子类型。

所以,这里就像大家介绍一种通用的元素收集方式,你可以将数据元素收集到任意的Collection类型:即向所需Collection类型提供构造函数的方式。




LinkedList<String> collectToCollection = Stream.of(

   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"

).collect(Collectors.toCollection(LinkedList::new));



//最终collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]



注意:代码中使用了LinkedList::new,实际是调用LinkedList的构造函数,将元素收集到Linked List。当然你还可以使用诸如LinkedHashSet::newPriorityQueue::new将数据元素收集为其他的集合类型,这样就比较通用了。

3.4.收集到Array

通过toArray(String[]::new)方法收集Stream的处理结果,将所有元素收集到字符串数组中。




String[] toArray = Stream.of(

   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"

) .toArray(String[]::new);



//最终toArray字符串数组中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]



3.5.收集到Map

使用Collectors.toMap()方法将数据元素收集到Map里面,但是出现一个问题:那就是管道中的元素是作为key,还是作为value。我们用到了一个Function.identity()方法,该方法很简单就是返回一个“ t -> t ”(输入就是输出的lambda表达式)。另外使用管道流处理函数distinct()来确保Map键值的唯一性。




Map<String, Integer> toMap = Stream.of(

    "Monkey", "Lion", "Giraffe", "Lemur", "Lion"

)

.distinct()

.collect(Collectors.toMap(

       Function.identity(),   //元素输入就是输出,作为key

       s -> (int) s.chars().distinct().count()// 输入元素的不同的字母个数,作为value

));



// 最终toMap的结果是: {Monkey=6, Lion=4, Lemur=5, Giraffe=6}   



3.6.分组收集groupingBy

Collectors.groupingBy用来实现元素的分组收集,下面的代码演示如何根据首字母将不同的数据元素收集到不同的List,并封装为Map。




Map<Character, List<String>> groupingByList =  Stream.of(

    "Monkey", "Lion", "Giraffe", "Lemur", "Lion"

)

.collect(Collectors.groupingBy(

       s -> s.charAt(0) ,  //根据元素首字母分组,相同的在一组

       // counting()        // 加上这一行代码可以实现分组统计

));



// 最终groupingByList内的元素: {G=[Giraffe], L=[Lion, Lemur, Lion], M=[Monkey]}

//如果加上counting() ,结果是:  {G=1, L=3, M=1}



四、其他常用方法





boolean containsTwo = IntStream.of(1, 2, 3).anyMatch(i -> i == 2);

// 判断管道中是否包含2,结果是: true



long nrOfAnimals = Stream.of(

    "Monkey", "Lion", "Giraffe", "Lemur"

).count();

// 管道中元素数据总计结果nrOfAnimals: 4



int sum = IntStream.of(1, 2, 3).sum();

// 管道中元素数据累加结果sum: 6



OptionalDouble average = IntStream.of(1, 2, 3).average();

//管道中元素数据平均值average: OptionalDouble[2.0]



int max = IntStream.of(1, 2, 3).max().orElse(0);

//管道中元素数据最大值max: 3



IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics();


# 总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

# Mybatis源码解析



![](https://img-blog.csdnimg.cn/img_convert/49c2f89ed383000cf82e589233c939a9.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/321226f2b553ca297458b42a83d4a15e.webp?x-oss-process=image/format,png)

).summaryStatistics();


# 总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

# Mybatis源码解析



[外链图片转存中...(img-F6qCLJP7-1714123675394)]

[外链图片转存中...(img-zURpClhu-1714123675394)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值