java8 stream常用操作
新建user对象
@Data
public class UserEntity implements Serializable {
private int userId;
private String userName;
private int age;
private String address;
private Date birthday;
private String phoneNumer;
private String email;
private int status;
private String remark;
private String sex;
}
新建数据
public List<UserEntity> getUserList() throws Exception {
List<UserEntity> list = new ArrayList<>();
UserEntity user1 = new UserEntity();
user1.setUserId(1);
user1.setUserName("tom");
user1.setAge(20);
user1.setAddress("北京市");
user1.setBirthday(DateUtil.convert2Date("1999-10-01", DateUtil.DATEFORMAT));
user1.setPhoneNumer("13500001111");
user1.setEmail("[email protected]");
user1.setStatus(1);
user1.setRemark("tom的备注");
user1.setSex("male");
UserEntity user2 = new UserEntity();
user2.setUserId(2);
user2.setUserName("lily");
user2.setAge(25);
user2.setAddress("上海市");
user2.setBirthday(DateUtil.convert2Date("1994-05-21", DateUtil.DATEFORMAT));
user2.setPhoneNumer("13800002222");
user2.setEmail("[email protected]");
user2.setStatus(1);
user2.setRemark("lily的备注");
user2.setSex("female");
UserEntity user3 = new UserEntity();
user3.setUserId(3);
user3.setUserName("Tony");
user3.setAge(30);
user3.setAddress("北京市");
user3.setBirthday(DateUtil.convert2Date("1989-05-21", DateUtil.DATEFORMAT));
user3.setPhoneNumer("13600003333");
user3.setEmail("[email protected]");
user3.setStatus(0);
user3.setRemark("Tony的备注");
user3.setSex("male");
UserEntity user4 = new UserEntity();
user4.setUserId(4);
user4.setUserName("Jack");
user4.setAge(38);
user4.setAddress("上海市");
user4.setBirthday(DateUtil.convert2Date("1981-02-11", DateUtil.DATEFORMAT));
user4.setPhoneNumer("131000055555");
user4.setEmail("[email protected]");
user4.setStatus(1);
user4.setRemark("Jack的备注");
user4.setSex("male");
UserEntity user5 = new UserEntity();
user5.setUserId(5);
user5.setUserName("Rain");
user5.setAge(25);
user5.setAddress("深圳市");
user5.setBirthday(DateUtil.convert2Date("1994-08-01", DateUtil.DATEFORMAT));
user5.setPhoneNumer("131000066666");
user5.setEmail("[email protected]");
user5.setStatus(1);
user5.setRemark("Rain的备注");
user5.setSex("female");
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
return list;
}
查找,过滤数据,filter。
可以用于快速查找,筛选集合中的数据,可以用于对集合中的某个字段拼接,可以用于获取2个集合中相同,不同的属性
/**
* 查找
**/
List<UserEntity> filterList = userList.stream()
.filter(userEntity -> userEntity.getUserName().equals("Jack"))
.collect(Collectors.toList());
System.out.println("过滤数据:" + JSONObject.toJSONString(filterList));
返回结果:
[
{
"address": "上海市",
"age": 38,
"birthday": 350668800000,
"email": "[email protected]",
"phoneNumer": "131000055555",
"remark": "Jack的备注",
"sex": "male",
"status": 1,
"userId": 4,
"userName": "Jack"
}
]
/**
* 过滤
**/
List<UserEntity> filterList = userList.stream()
.filter(userEntity -> userEntity.getAddress().contains("北京市"))
.collect(Collectors.toList());
System.out.println("过滤数据:" + JSONObject.toJSONString(filterList));
返回结果:
[
{
"address": "北京市",
"age": 20,
"birthday": 938707200000,
"email": "[email protected]",
"phoneNumer": "13500001111",
"remark": "tom的备注",
"sex": "male",
"status": 1,
"userId": 1,
"userName": "tom"
},
{
"address": "北京市",
"age": 30,
"birthday": 611679600000,
"email": "[email protected]",
"phoneNumer": "13600003333",
"remark": "Tony的备注",
"sex": "male",
"status": 0,
"userId": 3,
"userName": "Tony"
}
]
/**
* 拼接
**/
String chargeDesc = userList.stream()
.filter(userEntity -> userEntity.getAddress().equals("北京市"))
.map(userEntity -> userEntity.getUserName())
.collect(Collectors.joining(" , ", "以下这些人", "是地地道道的北京人"));
System.out.println("过滤字符拼接:" + chargeDesc);
返回结果:
过滤字符拼接:以下这些人tom , Tony是地地道道的北京人
分组 groupBy,可以分类处理数据
/**
* 分组
**/
Map<String, List<UserEntity>> addressList = userList.stream().collect(Collectors.groupingBy(UserEntity::getAddress));
System.out.println("根据地址分组:" + JSONObject.toJSONString(addressList));
根据地址分组:
{
"上海市": [
{
"address": "上海市",
"age": 25,
"birthday": 769449600000,
"email": "[email protected]",
"phoneNumer": "13800002222",
"remark": "lily的备注",
"sex": "female",
"status": 1,
"userId": 2,
"userName": "lily"
},
{
"address": "上海市",
"age": 38,
"birthday": 350668800000,
"email": "[email protected]",
"phoneNumer": "131000055555",
"remark": "Jack的备注",
"sex": "male",
"status": 1,
"userId": 4,
"userName": "Jack"
}
],
"北京市": [
{
"address": "北京市",
"age": 20,
"birthday": 938707200000,
"email": "[email protected]",
"phoneNumer": "13500001111",
"remark": "tom的备注",
"sex": "male",
"status": 1,
"userId": 1,
"userName": "tom"
},
{
"address": "北京市",
"age": 30,
"birthday": 611679600000,
"email": "[email protected]",
"phoneNumer": "13600003333",
"remark": "Tony的备注",
"sex": "male",
"status": 0,
"userId": 3,
"userName": "Tony"
}
],
"深圳市": [
{
"address": "深圳市",
"age": 25,
"birthday": 775670400000,
"email": "[email protected]",
"phoneNumer": "131000066666",
"remark": "Rain的备注",
"sex": "female",
"status": 1,
"userId": 5,
"userName": "Rain"
}
]
}
Map<String, List<UserEntity>> ageList = userList.stream().collect(Collectors.groupingBy(UserEntity::getSex));
System.out.println("根据性别分组:" + JSONObject.toJSONString(ageList));
根据性别分组:
{
"female": [
{
"address": "上海市",
"age": 25,
"birthday": 769449600000,
"email": "[email protected]",
"phoneNumer": "13800002222",
"remark": "lily的备注",
"sex": "female",
"status": 1,
"userId": 2,
"userName": "lily"
},
{
"address": "深圳市",
"age": 25,
"birthday": 775670400000,
"email": "[email protected]",
"phoneNumer": "131000066666",
"remark": "Rain的备注",
"sex": "female",
"status": 1,
"userId": 5,
"userName": "Rain"
}
],
"male": [
{
"address": "北京市",
"age": 20,
"birthday": 938707200000,
"email": "[email protected]",
"phoneNumer": "13500001111",
"remark": "tom的备注",
"sex": "male",
"status": 1,
"userId": 1,
"userName": "tom"
},
{
"address": "北京市",
"age": 30,
"birthday": 611679600000,
"email": "[email protected]",
"phoneNumer": "13600003333",
"remark": "Tony的备注",
"sex": "male",
"status": 0,
"userId": 3,
"userName": "Tony"
},
{
"address": "上海市",
"age": 38,
"birthday": 350668800000,
"email": "[email protected]",
"phoneNumer": "131000055555",
"remark": "Jack的备注",
"sex": "male",
"status": 1,
"userId": 4,
"userName": "Jack"
}
]
}
提取字段到map里面toMap
可以根据集合中的某个字段提取出来,转换成map
/**
* 转换成map
**/
List<String> nameList = userList.stream().map(UserEntity::getUserName).collect(Collectors.toList());
System.out.println("获取所有用户名:" + JSONObject.toJSONString(nameList));
获取所有用户名:["tom","lily","Tony","Jack","Rain"]
Map<String, String> userMap = userList.stream().collect(Collectors.toMap(UserEntity::getUserName,
userEntity -> userEntity.getPhoneNumer()));
System.out.println("转换成map: " + JSONObject.toJSONString(userMap));
转换成map: {"Jack":"131000055555","Rain":"131000066666","Tony":"13600003333","lily":"13800002222","tom":"13500001111"}
// 集合转成map
Map<Integer, UserEntity> map = userList.stream()
.collect(Collectors.toMap(UserEntity::getUserId, userEntity -> userEntity));
map和flatMap 常用用法
假设有个一个学校类,学校里面有不同的班级类
@Data
public class School {
private long id;
private String schoolName;
private String address;
// 1=小学,2=初中,3=高中
private Integer type;
// 班级集合
List<ClassT> classTList;
}
@Data
public class ClassT {
private long schoolId;
private String className;
private Integer studentNum;
}
private List<School> setData() {
List<School> schoolList = new ArrayList<>();
// 学校一
School school0 = new School();
school0.setId(0);
school0.setSchoolName("北京一中");
school0.setAddress("北京市海淀区");
school0.setType(1);
List<ClassT> beijingClassList0 = new ArrayList<>();
ClassT classT0 = new ClassT();
classT0.setSchoolId(0);
classT0.setClassName("小1班");
classT0.setStudentNum(35);
ClassT classT01 = new ClassT();
classT01.setSchoolId(1);
classT01.setClassName("小2班");
classT01.setStudentNum(40);
beijingClassList0.add(classT0);
beijingClassList0.add(classT01);
school0.setClassTList(beijingClassList0);
School school1 = new School();
school1.setId(1);
school1.setSchoolName("北京四中");
school1.setAddress("北京市朝阳区");
school1.setType(2);
List<ClassT> beijingClassList = new ArrayList<>();
ClassT classT = new ClassT();
classT.setSchoolId(1);
classT.setClassName("二年级1班");
classT.setStudentNum(35);
ClassT classT2 = new ClassT();
classT2.setSchoolId(1);
classT2.setClassName("三年级3班");
classT2.setStudentNum(40);
beijingClassList.add(classT);
beijingClassList.add(classT2);
school1.setClassTList(beijingClassList);
// 学校二
School school2 = new School();
school2.setId(2);
school2.setSchoolName("上海克林顿外国语");
school2.setAddress("上海市徐家汇区");
school2.setType(2);
List<ClassT> shagnhaiClassList = new ArrayList<>();
ClassT classT3 = new ClassT();
classT3.setSchoolId(2);
classT3.setClassName("英语班");
classT3.setStudentNum(20);
ClassT classT4 = new ClassT();
classT4.setSchoolId(2);
classT4.setClassName("德语班");
classT4.setStudentNum(15);
shagnhaiClassList.add(classT3);
shagnhaiClassList.add(classT4);
school2.setClassTList(shagnhaiClassList);
// 学校三
School school3 = new School();
school3.setId(3);
school3.setSchoolName("深圳中学");
school3.setAddress("深圳市福田区");
school3.setType(3);
List<ClassT> shenzhenClassList = new ArrayList<>();
ClassT classT5 = new ClassT();
classT5.setSchoolId(3);
classT5.setClassName("高三1班");
classT5.setStudentNum(50);
ClassT classT6 = new ClassT();
classT6.setSchoolId(3);
classT6.setClassName("高三8班");
classT6.setStudentNum(45);
shenzhenClassList.add(classT5);
shenzhenClassList.add(classT6);
school3.setClassTList(shenzhenClassList);
schoolList.add(school0);
schoolList.add(school1);
schoolList.add(school2);
schoolList.add(school3);
return schoolList;
}
// 测试map和flatMap
@Test
public void testFlatMap() {
List<School> schoolList = setData();
// 所有学校名称集合
List<String> schoolNameList = schoolList.stream().map(School::getSchoolName).collect(Collectors.toList());
System.out.println(JsonUtil.toJson(schoolNameList));
// ["北京一中","北京四中","上海克林顿外国语","深圳中学"]
// 转成map, key,value都是string类型
Map<String, String> schoolMap = schoolList.stream().collect(Collectors.toMap(School::getSchoolName, School::getAddress));
System.out.println(JsonUtil.toJson(schoolMap));
// {"深圳中学":"深圳市福田区","北京四中":"北京市朝阳区","北京一中":"北京市海淀区","上海克林顿外国语":"上海市徐家汇区"}
// 转成map2, value是对象类型
Map<Long, School> schoolMap2 = schoolList.stream().collect(Collectors.toMap(School::getId, school -> school, (k, v) -> k));
System.out.println(JsonUtil.toJson(schoolMap2));
// {"0":{"id":0,"schoolName":"北京一中","address":"北京市海淀区","type":1,"classTList":[{"schoolId":0,"className":"小1班","studentNum":35},{"schoolId":1,"className":"小2班","studentNum":40}]},"1":{"id":1,"schoolName":"北京四中","address":"北京市朝阳区","type":2,"classTList":[{"schoolId":1,"className":"二年级1班","studentNum":35},{"schoolId":1,"className":"三年级3班","studentNum":40}]},"2":{"id":2,"schoolName":"上海克林顿外国语","address":"上海市徐家汇区","type":2,"classTList":[{"schoolId":2,"className":"英语班","studentNum":20},{"schoolId":2,"className":"德语班","studentNum":15}]},"3":{"id":3,"schoolName":"深圳中学","address":"深圳市福田区","type":3,"classTList":[{"schoolId":3,"className":"高三1班","studentNum":50},{"schoolId":3,"className":"高三8班","studentNum":45}]}}
// 北京学校所有的名称
List<String> beijingClassList = schoolList.stream().filter(school -> school.getSchoolName().contains("北京")).
map(classT -> classT.getSchoolName()).collect(Collectors.toList());
System.out.println(JsonUtil.toJson(beijingClassList));
// ["北京一中","北京四中"]
// 所有学校下所有班级集合,提取集合对象中的集合
List<ClassT> classTList = schoolList.stream().flatMap(school -> school.getClassTList().stream()).collect(Collectors.toList());
System.out.println(JsonUtil.toJson(classTList));
// [{"schoolId":0,"className":"小1班","studentNum":35},{"schoolId":1,"className":"小2班","studentNum":40},{"schoolId":1,"className":"二年级1班","studentNum":35},{"schoolId":1,"className":"三年级3班","studentNum":40},{"schoolId":2,"className":"英语班","studentNum":20},{"schoolId":2,"className":"德语班","studentNum":15},{"schoolId":3,"className":"高三1班","studentNum":50},{"schoolId":3,"className":"高三8班","studentNum":45}]
// 所有班级集合,提取集合对象中的集合(方法二)
List<ClassT> classTList1 = schoolList.stream().map(school -> school.getClassTList()).flatMap(Collection::stream).collect(Collectors.toList());
System.out.println(JsonUtil.toJson(classTList1));
// [{"schoolId":0,"className":"小1班","studentNum":35},{"schoolId":1,"className":"小2班","studentNum":40},{"schoolId":1,"className":"二年级1班","studentNum":35},{"schoolId":1,"className":"三年级3班","studentNum":40},{"schoolId":2,"className":"英语班","studentNum":20},{"schoolId":2,"className":"德语班","studentNum":15},{"schoolId":3,"className":"高三1班","studentNum":50},{"schoolId":3,"className":"高三8班","studentNum":45}]
// 上海所有学校的班级集合,多级操作
List<ClassT> shagnhaiClassList = schoolList.stream().filter(school -> school.getSchoolName().contains("上海")).
flatMap(shanghaiSchool -> shanghaiSchool.getClassTList().stream()).collect(Collectors.toList());
System.out.println(JsonUtil.toJson(shagnhaiClassList));
// [{"schoolId":2,"className":"英语班","studentNum":20},{"schoolId":2,"className":"德语班","studentNum":15}]
// 北京一中的班级集合
List<ClassT> yizhongClassList = schoolList.stream().filter(school -> school.getSchoolName().equals("北京一中")).
map(beijingSchool -> beijingSchool.getClassTList()).flatMap(Collection::stream).collect(Collectors.toList());
System.out.println(JsonUtil.toJson(yizhongClassList));
// [{"schoolId":0,"className":"小1班","studentNum":35},{"schoolId":1,"className":"小2班","studentNum":40}]
// 初中所有班级
List<ClassT> twoTypeClassList = schoolList.stream().filter(school -> school.getType().equals(2)).
flatMap(twoTypeSchool -> twoTypeSchool.getClassTList().stream()).collect(Collectors.toList());
System.out.println(JsonUtil.toJson(twoTypeClassList));
// [{"schoolId":1,"className":"二年级1班","studentNum":35},{"schoolId":1,"className":"三年级3班","studentNum":40},{"schoolId":2,"className":"英语班","studentNum":20},{"schoolId":2,"className":"德语班","studentNum":15}]
}
去重,可以用于根据一个或者多个属性对集合中的数据进行去重操作
/**
* 去重
**/
// 根据性别去重得到性别的种类
List<String> sexList = userList.stream().map(UserEntity::getSex).collect(Collectors.toList());
List<String> distinctList = sexList.stream().distinct().collect(Collectors.toList());
System.out.println("单个属性去重返回属性集合:" + JSONObject.toJSONString(distinctList));
单个属性去重返回属性集合:["male","female"]
// 根据年龄去重,得到去重后的集合,集合中只有相同属性的第一个对象,其它的忽略掉了
List<UserEntity> userEntityList = userList.stream()
.collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(
Comparator.comparing(UserEntity::getAge)
)
), ArrayList::new)
);
System.out.println("单个属性去重返回集合:" + JSONObject.toJSONString(userEntityList));
单个属性去重返回集合:[{"address":"北京市","age":20,"birthday":938707200000,"email":"[email protected]","phoneNumer":"13500001111","remark":"tom的备注","sex":"male","status":1,"userId":1,"userName":"tom"},{"address":"上海市","age":25,"birthday":769449600000,"email":"[email protected]","phoneNumer":"13800002222","remark":"lily的备注","sex":"female","status":1,"userId":2,"userName":"lily"},{"address":"北京市","age":30,"birthday":611679600000,"email":"[email protected]","phoneNumer":"13600003333","remark":"Tony的备注","sex":"male","status":0,"userId":3,"userName":"Tony"},{"address":"上海市","age":38,"birthday":350668800000,"email":"[email protected]","phoneNumer":"131000055555","remark":"Jack的备注","sex":"male","status":1,"userId":4,"userName":"Jack"}]
// 根据性别和地址去重,返回
List<UserEntity> doubleProList = userEntityList.stream()
.collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(
Comparator.comparing(userEntity -> userEntity.getSex() + ";" + userEntity.getAddress())
)
), ArrayList::new)
);
System.out.println("多个属性去重返回集合:" + JSONObject.toJSONString(doubleProList));"}
排序sort
/**
* 排序
**/
List<UserEntity> list = userList.stream()
.sorted(Comparator.comparingDouble(UserEntity::getAge))
.collect(Collectors.toList());
System.out.println("排序后:" + JSONObject.toJSONString(list));
函数计算,sum,min,max,average
/**
* 函数计算
**/
// 求和
int sum = userList.stream().mapToInt(UserEntity::getAge).sum();
// 最小值
int min = userList.stream().mapToInt(UserEntity::getAge).min().getAsInt();
// 最大值
int max = userList.stream().mapToInt(UserEntity::getAge).max().getAsInt();
// 求平局值 保留两位小数点
DecimalFormat df = new DecimalFormat("0.00");
double aver = userList.stream().mapToDouble(UserEntity::getAge).average().getAsDouble();
System.out.println("总年龄:" + sum + ";最小年龄:" + min + ";最大年龄:" + max + ";年龄平局值:" + df.format(aver));
Map<String, Double> collect = userList.stream()
.collect(Collectors.groupingBy(UserEntity::getAddress,
Collectors.averagingDouble(UserEntity::getAge)));
System.out.println("分组求和统计数据:" + collect);
总年龄:138;最小年龄:20;最大年龄:38;年龄平局值:27.60
分组求和统计数据:{深圳市=25.0, 上海市=31.5, 北京市=25.0}