学习完 Stream 的编程风格之后,我敢保证,你会爱上它!
一、遍历操作
2.1、遍历集合
只需要通过一行代码,即可实现:
/**
* jdk8 从集合对象中获取用户ID集合
* @param userList
* @return
*/
public List<Long> getUserIds(List<User> userList){
List<Long> userIds = userList.stream().map(User::getUserId).collect(Collectors.toList());
return userIds;
}
2.2、筛选元素
采用 Stream api,我们只需要通过filter方法来筛选出需要的数据,即可过滤出用户ID不为空的数据。
/**
* jdk8 从集合对象中筛选出用户ID不为空的数据
* @param userList
* @return
*/
public List<Long> getUserIds8(List<User> userList){
List<Long> userIds = userList.stream().filter(item -> item.getUserId() != null).map(User::getUserId).collect(Collectors.toList());
return userIds;
}
2.3、删除重复的内容
如果你想对返回的集合内容排除重复的数据,操作也很简单,在合并的时候使用Collectors.toSet()即可!
/**
* jdk8 从集合对象中筛选出用户ID不为空的数据,并进行去重
* @param userList
* @return
*/
public Set<Long> getUserIds(List<User> userList){
Set<Long> userIds = userList.stream().filter(item -> item.getUserId() != null).map(User::getUserId).collect(Collectors.toSet());
return userIds;
}
2.4、数据类型转换
在实际的开发过程中,经常会出现数据类型定义不一致的问题,例如有的系统,使用String接受,有的是用Long我们需要将其转换
/**
* jdk8 将Long类型数据转换成String类型
* @param userIds
* @return
*/
public List<String> getUserIds10(List<Long> userIds){
List<String> userIdStrs = userIds.stream().map(x -> x.toString()).collect(Collectors.toList());
return userIdStrs;
}
2.5、数组转集合
数组需要转成集合,采用 stream api 操作也很简单!
public static void main(String[] args) {
//转换后的List 属于 java.util.ArrayList 能进行正常的增删查操作
List<String> strList = Stream.of(new String[]{"a","b","c"}).collect(Collectors.toList());
}
二、集合转Map操作
在实际的开发过程中将集合元素中某个主键字段作为key,元素作为value,来实现集合转map的需求,这种需求在数据组装方面使用的非常多!
2.1、集合转 map(不分组)
在 jdk8 中,采用 stream api的方式,我们只需要一行代码即可实现
/**
* jdk8 将集合转换成Map,其中用户ID作为主键key,如果集合对象有重复的key,以第一个匹配到的为主
* @param userList
* @return
*/
public Map<Long, User> getMap(List<User> userList){
Map<Long, User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, v -> v, (k1,k2) -> k1));
return userMap;
}
打开Collectors.toMap方法源码,一起来看看到底是啥。
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction) {
return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}
2.2、集合转map(分组)
在实际的操作中,有一些场景需要我们将相同的key,加入到一个集合,而不是覆盖,哪改如何做呢?在 jdk8 中,采用 stream api的方式,我们只需要一行代码即可实现
/**
* jdk8 将集合转换成Map,将相同的key,加入到一个集合中,实现分组
* @param userList
* @return
*/
public Map<Long, List<User>> getMapGroup(List<User> userList){
Map<Long, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getUserId));
return userMap;
}
三、分页操作
stream api 的强大之处还不仅仅是对集合进行各种组合操作,还支持分页操作。
例如,将如下的数组从小到大进行排序,排序完成之后,从第1行开始,查询10条数据出来,操作如下:
//需要查询的数据
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,10, 6, 20, 30, 40, 50, 60, 100);
List<Integer> dataList= numbers.stream().sorted((x, y) -> x.compareTo(y)).skip(0).limit(10).collect(Collectors.toList());
System.out.println(dataList.toString());
其中skip参数表示第几行,limit表示查询的数量,类似页容量!
四、查找与匹配操作
stream api 还支持对集合进行查找,同时还支持正则匹配模式。
- allMatch(检查是否匹配所有元素)
List<Integer> list = Arrays.asList(10, 5, 7, 3);
boolean allMatch = list.stream()//
.allMatch(x -> x > 2);//是否全部元素都大于2
System.out.println(allMatch);
- findFirst(返回第一个元素)
List<Integer> list = Arrays.asList(10, 5, 7, 3);
Optional<Integer> first = list.stream()//
.findFirst();
Integer val = first.get();
System.out.println(val);//输出10
- reduce(可以将流中元素反复结合起来,得到一个值)
List<Integer> list = Arrays.asList(10, 5, 7, 3);
Integer result = list.stream()//
.reduce(2, Integer::sum);
System.out.println(result);//输出27,其实相当于2+10+5+7+3,就是一个累加
stream api 支持的操作方法非常多,这里只列举了几种类型,具体在使用的时候,可以参考官网接口文档说明!
最后说一句(求关注!别白嫖!)
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!
**