java8 stream項目常用方法

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}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章