目录
3.map()——对某个元素进行指定操作,并将处理后的元素存入新的List
6.flatMap()——将流中每一元素转换为一个新的流并连接形成一个新的流
12.anyMatch()、allMatch()、noneMatch()——判断流中是否有满足指定条件的元素
13.findAny()、findFrist()——查找流中第一个或任意一个元素
一、Stream流介绍
Stream是Java8 API添加的一个新的抽象,称之为流Stream,以一种声明性方式处理数据集合,其侧重于对于源数据计算能力的封装,同时支持序列与并行两种操作方式。(Stream流是对集合对象功能的增强,与Lambda表达式结合,可以提高编程效率以及代码的可读性)
对于Stream流我们可以理解为工厂流水线一样,每一个流都是按照创建——>操作处理——>得到结果。其接口继承关系如下图所示
二、常见API合集
1.数据准备
后续大部分案例我们都以User作为例子
package day0716;
public class User {
private String name;
private int age;
private String sex;
private double height;
public User(){
}
public User(String name, int age, String sex, double height) {
this.name = name;
this.age = age;
this.sex = sex;
this.height = height;
}
public String getName() {
return name;
}
public void setName(String userName) {
this.name = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", bodyHeight=" + height +
'}';
}
}
2.collect()——动态创建List并添加元素
/**
* 利用Stream流动态创建list并添加元素
* @author wdl
* @param users
*/
public static List<User> createList(User... users){
List<User> usersList = Stream.of(users).collect(Collectors.toList());
return usersList;
}
3.map()——对某个元素进行指定操作,并将处理后的元素存入新的List
/**
* 获取list中对象某一属性,并生成新的list。此处以获取User对象的name为例
* @author wdl
* @param userList
*/
public static List<String> collectName(List<User> userList){
List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
return nameList;
}
4.filter()——根据指定条件过滤掉流中的元素
/**
* 利用stream的filter方法,过滤掉我们不需要的数据,此处以过滤User对象中name为空的例子
* @author wdl
* @param userList
*/
public static List<User> filterNull(List<User> userList){
List<User> filterList = userList.stream().filter(user -> user.getName()!=null).collect(Collectors.toList());
return filterList;
}
5.forEach()——对每个元素执行指定操作
/**
* 对流中的每个元素进行操作,此处以修改每个user的age == 18为例
* @author wdl
* @param userList
* @return
*/
public static List<User> forEachSetAge(List<User> userList){
userList.stream().forEach(user -> user.setAge(18));
return userList;
}
6.flatMap()——将流中每一元素转换为一个新的流并连接形成一个新的流
可理解为一个List中的所有元素都是List,使用方法后将元素List拆开,形成一个新的List。
/**
* 将流中每个元素转换为流,将这些流整合为一个新的流。
* 此处我们以List作为元素装入一个List为例,最后生成一个新的List
* @author wdl
* @param nameList
* @return
*/
public static List<String> flatMapList(List<List<String>> nameList){
List<String> newStringList = nameList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
return newStringList;
}
7. reduce()——流的累积操作
/**
* 对流中的元素进行累积操作,如最大、最小、求和
* @author wdl
* @param ageList
* @return sumAge
*/
public static Integer reduceAge(List<Integer> ageList){
// 求和
Integer sumAge = ageList.stream().reduce(0, Integer::sum);
// 最大值
// Integer maxAge = ageList.stream().reduce(0, Integer::max);
// 最小值
// Integer minAge = ageList.stream().reduce(0, Integer::min);
return sumAge;
}
8.distinct()——去掉重复元素
/**
* 对流中的元素进行去重操作
* @author wdl
* @param repeatList
* @return integerList
*/
public static List<Integer> distinctAge(List<Integer> repeatList){
List<Integer> integerList = repeatList.stream()
.distinct()
.collect(Collectors.toList());
return integerList;
}
9.sorted()——排序操作
/**
* 对流中的元素进行排序操作
* @author wdl
* @param disorderedList
* @return ordinalList
*/
public static List<Integer> sortedList(List<Integer> disorderedList){
List<Integer> ordinalList = disorderedList.stream()
.sorted()
.collect(Collectors.toList());
return ordinalList;
}
10.limit()——截断流,指定所需保留元素个数
/**
* 对流中的元素进行截断操作
* @author wdl
* @param targetList
* @return newlimitList
*/
public static List<Integer> limitList(List<Integer> targetList,int targetNumber ){
List<Integer> newlimitList = targetList.stream()
.limit(targetNumber)
.collect(Collectors.toList());
return newlimitList;
}
11.skip()——跳过指定数量的元素
/**
* 跳过target个数的元素
* @author wdl
* @param targetList
* @return newlimitList
*/
public static List<Integer> skipList(List<Integer> targetList,int target ){
List<Integer> newSkipList = targetList.stream()
.skip(target)
.collect(Collectors.toList());
return newSkipList;
}
12.anyMatch()、allMatch()、noneMatch()——判断流中是否有满足指定条件的元素
/**
* 判断流中是否有任意一个元素与target目标元素匹配
* 此处因为使用的Integer类型的List 以及 int类型的target
* 可根据需求修改传入参数类型
* @author wdl
* @param targetList target
* @return anyMatchBoolean
*/
public static boolean anyMatchList(List<Integer> targetList,int target ){
boolean anyMatchBoolean = targetList.stream()
// 这里的匹配条件根据需求自行修改
.anyMatch(i -> i == target);
return anyMatchBoolean;
}
/**
* 判断流中是否所有元素与target目标元素匹配
* 此处因为使用的Integer类型的List 以及 int类型的target
* 可根据需求修改传入参数类型
* @author wdl
* @param targetList target
* @return allMatchBoolean
*/
public static boolean allMatchList(List<Integer> targetList,int target ){
boolean allMatchBoolean = targetList.stream()
// 这里的匹配条件根据需求自行修改
.allMatch(i -> i == target);
return allMatchBoolean;
}
/**
* 判断流中是否没有任何一个元素与target目标元素匹配
* 此处因为使用的Integer类型的List 以及 int类型的target
* 可根据需求修改传入参数类型
* @author wdl
* @param targetList target
* @return noneMatchBoolean
*/
public static boolean noneMatchList(List<Integer> targetList,int target ){
boolean noneMatchBoolean = targetList.stream()
// 这里的匹配条件根据需求自行修改
.noneMatch(i -> i == target);
return noneMatchBoolean;
}
13.findAny()、findFrist()——查找流中第一个或任意一个元素
/**
* 查找流中第一个元素
* @author wdl
* @param targetList
* @return integer
*/
public static Integer findFristList(List<Integer> targetList){
Integer integer = targetList.stream().findFirst().orElse(1);
return integer;
}
/**
* 查找流中任意一个元素
* @author wdl
* @param targetList
* @return integer
*/
public static Integer findAnyList(List<Integer> targetList ){
Integer integer = targetList.stream().findAny().orElse(1);
return integer;
}
14.min()、max()——可查找流中最大或最小值
/**
* 查找流中最大元素
* @author wdl
* @param targetList
* @return max
*/
public static Integer findMaxList(List<Integer> targetList){
Integer max = targetList.stream().max(Integer::compareTo).orElse(null);
return max;
}
/**
* 查找流中最小元素
* @author wdl
* @param targetList
* @return min
*/
public static Integer findMinList(List<Integer> targetList ){
Integer min = targetList.stream().min(Integer::compareTo).orElse(null);
return min;
}
15.groupBy()——按照指定条件进行分组
/**
* 利用Collectors.groupingBy,根据我们所需要的某些属性进行分组
* 此处以根据User对象的sex字段进行分组。
* @author wdl
* @param userList
* @return
*/
public static Map<String,List<User>> groupBySex(List<User> userList){
Map<String, List<User>> sexMap = userList.stream()
.collect(Collectors.groupingBy(User::getSex, Collectors.toList()));
return sexMap;
}
16.利用stream流的特质,可对某一属性进行求和
/**
* 利用stream流求和,返回对象中某一属性的总和
* 数据类型只能为:int, double, long
* @author wdl
* @param userList
* @return
*/
public static Double sumHeight(List<User> userList){
Double heightSum = userList.stream().mapToDouble(User::getHeight).sum();
return heightSum;
}
17.利用流将List转化为Map
/**
* 利用stream流将list转化为map使用
* (1)转换map,key重复问题;代码中使用(key1,key2)->key2表达式可以解决此类问题,
* 如果出现重复的key就使用key2覆盖前面的key1,也可以定义成(key1,key2)->key1,保留key1,根据自己的业务场景来调整。
* (2)空指针异常,即转为map的value是null。这个可以用filter过滤;
* @auhtor wdl
* @param users
* @return stringUserMap
*/
public Map<String, User> listToMap(List<User> users){
Map<String, User> stringUserMap = users.stream()
.collect(Collectors.toMap(User::getName, Function.identity(), (key1, key2) -> key1));
return stringUserMap;
}
18.同理我们也可以使用流将Map转化为List
/**
* 利用stream流将map转化为list
* @author wdl
* @param userMap
* @return userMapList
*/
public List<User> mapToList(Map<String, User> userMap){
List<User> userMapList = userMap.entrySet().stream()
.map(item -> item.getValue())
.collect(Collectors.toList());
return userMapList;
}
19.利用流实现分页功能
/**
* 分页功能
* @author
* @param map
* @param pageNum
* @param pageSize
* @return pagedMap
*/
public Map<String,Object> pagingMap(Map<String,Object> map,Integer pageNum,Integer pageSize){
// 将Map转换为Stream
Stream<Map.Entry<String, Object>> mapStream = map.entrySet().stream();
// 计算分页起始位置
int start = (pageNum - 1) * pageSize;
// 计算分页结束位置
int end = start + pageSize;
// 跳过前start个元素
Map<String, Object> pagedMap = mapStream.skip(start)
// 最多返回pageSize个元素
.limit(pageSize)
// 将结果转换回Map
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
return pagedMap;
}
三、总结
以上就是本文整理出来的一些常用方法以及方法的综合运用,大家若有一些好的案例也希望大家分享在评论区,最后祝愿大家早日升P7!!!