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}