无数次为流计算惊奇和赞叹。其实我也是近几个月才开始大量使用流计算的,很早以前就接触到了但是一直没重视。新公司大部分代码用到了流计算,为了入乡随俗所以学着使用,现在只想说真香。下面简单的记录几个常用的计算方法。
List转Map
list转map是比较常见的功能。其中又可以细分两种,一种是1v1转,一种是1vN转,也就是传说中的分组。
1v1-list转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转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转Map
一定程度上set和list是一样的,所以这里也可以和上面一样处理。
1vN-set转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转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互相转化
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());
}
字符串转化成List
注意这里我用的例子是转化成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();
}
根据条件过滤转化
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());
}
感觉常用的语法好像就这么多了,其实说实话流计算本身解决不了技术上的问题,但是大大方便的使用者的调用。以上功能自己去遍历循环等最终也可以实现的,不过现在一行代码解决还是方便的很。其实它应该还有很多语法,感兴趣的可以自己去看API。
本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利,生活健健康康!
网友评论