公司的项目中大量用到了Stream
API,或者说,能用到Stream
的地方都用了,写的人固然很爽,但有时维护的人还是会骂街。
骂归骂,自己爽比较重要。
于是记录了一些Stream
用法防止忘记,基础的forEach/filter/map
用法就略过了。
以后遇到有意思的Stream
用法,也会记录在这里。
Java Stream
flatMap
经常会迷惑map
和flatMap
区别是啥,我也说不好,直接上代码吧。
它可以用在类似Map<K, List<T>>
的结构中(或者说MultiMap
),操作所有List<T>
的元素。
使用听不懂的说法,它将Stream<Collection<T>>
“拉平”成Stream<T>
。
注:为了简化基础集合类型的初始化,使用了Guava
API。
convert List to Map
将List
转为Map
,约定Map
中每个key
对应的value
都是唯一的。
convert List to MultiMap
上述的转换当key
对应的value
并非唯一时,可能希望转换成Map<K, List<T>>/MultiMap
的形式。
想改变MultiMap
中Entry
的类型。
Guava Collection
Guava
提供了很方便的集合类型和接口,下面用Guava
再实现一下上面的操作。
flatMap
Guava
直接提供了MultiMap
类型。
convert List to Map
这里的做法是分成两步骤:
- 先将
key
提取出来;
- 再将
value
转换成所需的格式。
测试代码使用了String
类型,实际使用中是对象的话,就可以将第二步省略,除非还要再转换对象。
convert List to MultiMap
大致逻辑和使用Stream
相同,只是返回类型变成了MultiMap
。
Guava
不提供transformKeys
的方法。
一个比较好的解释
所以这里使用Guava
只能对value
进行转换。
这是在工作中遇到的一个转换,记录下来。
一句话版本:
其实原理都和List
转MultiMap
一样:先提取出key
,将value
转为集合,当key
冲突时,合并两个集合。
list to nested map
碎碎念
年轻的生命中突然出现Stream
,玩法超多逼格又高,吸引码农们不好好写代码。
学不动求不更。
9月了,专升本这边一开学,估计正式要学位考了,这段时间会复习,力扣每日一题很遗憾只能断签。工作上也不乐观,写代码占20%时间,单元测试需要80%时间,每天的工作完不成,得加班了。