無數(shù)次為流計算驚奇和贊嘆箕憾。其實我也是近幾個月才開始大量使用流計算的擂煞,很早以前就接觸到了但是一直沒重視。新公司大部分代碼用到了流計算酵使,為了入鄉(xiāng)隨俗所以學著使用菩佑,現(xiàn)在只想說真香。下面簡單的記錄幾個常用的計算方法凝化。
List轉(zhuǎn)Map
list轉(zhuǎn)map是比較常見的功能。其中又可以細分兩種酬荞,一種是1v1轉(zhuǎn)搓劫,一種是1vN轉(zhuǎn),也就是傳說中的分組混巧。
1v1-list轉(zhuǎn)map:
public static void main(String[] args) {
List<UserVO> list = new ArrayList<>();
//list中對象userId唯一枪向,orgId 分三種0,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
list.add(userVO);
}
//以整個對象為value
Map<Integer,UserVO> map = list.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
//以對象某個屬性為value
Map<Integer,String> nameMap = list.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
}
1vN-list轉(zhuǎn)map:
public static void main(String[] args) {
List<UserVO> list = new ArrayList<>();
//list中對象userId唯一咧党,orgId 分三種0秘蛔,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
list.add(userVO);
}
//以整個對象為value
Map<Integer,List<UserVO>> map = list.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
}
Set轉(zhuǎn)Map
一定程度上set和list是一樣的,所以這里也可以和上面一樣處理傍衡。
1vN-set轉(zhuǎn)map:
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
//list中對象userId唯一深员,orgId 分三種0,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
//以整個對象為value
Map<Integer,List<UserVO>> map = set.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
}
1v1-set轉(zhuǎn)map:
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
//list中對象userId唯一蛙埂,orgId 分三種0倦畅,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
//以整個對象為value
Map<Integer,UserVO> entityMap = set.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
//以某一屬性為value
Map<Integer,String> map = set.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
}
Set與List互相轉(zhuǎn)化
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
//list中對象userId唯一,orgId 分三種0绣的,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
List<UserVO> list = set.stream().collect(Collectors.toList());
Set<UserVO> setNew = list.stream().collect(Collectors.toSet());
}
字符串轉(zhuǎn)化成List
注意這里我用的例子是轉(zhuǎn)化成Integer叠赐。所以多了Integer::valueOf這個步驟欲账。
public static void main(String[] args) {
String str = "2312,1,524,67,23,58,32";
ArrayList<Integer> list = Arrays.stream(str.split(","))
.map(String::trim).map(Integer::valueOf)
.collect(Collectors.toCollection(ArrayList::new));
System.out.println(list);
}
List/Set中某一列求和
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
//list中對象userId唯一,orgId 分三種0芭概,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
Integer sum = set.stream().mapToInt(UserVO::getOrgId).sum();
List<UserVO> list = set.stream().collect(Collectors.toList());
Integer sum1 = list.stream().mapToInt(UserVO::getOrgId).sum();
}
根據(jù)條件過濾轉(zhuǎn)化
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
//list中對象userId唯一赛不,orgId 分三種0,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
List<UserVO> list = set.stream().filter(u->u.getUserId()<10).collect(Collectors.toList());
System.out.println(list.size());
}
List/Set對象的某一屬性組成新的list/set
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
//list中對象userId唯一罢洲,orgId 分三種0踢故,1.2
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
List<String> list = set.stream().map(UserVO::getFullName).collect(Collectors.toList());
}
感覺常用的語法好像就這么多了,其實說實話流計算本身解決不了技術(shù)上的問題奏路,但是大大方便的使用者的調(diào)用畴椰。以上功能自己去遍歷循環(huán)等最終也可以實現(xiàn)的,不過現(xiàn)在一行代碼解決還是方便的很鸽粉。其實它應該還有很多語法斜脂,感興趣的可以自己去看API。
本篇筆記就記到這里触机,如果稍微幫到你了記得點個喜歡點個關(guān)注帚戳,也祝大家工作順順利利,生活健健康康儡首!