Java8 實(shí)現(xiàn)stream將對象集合list中抽取屬性集合轉(zhuǎn)化為map或list
首先新建一個實(shí)體類Person
@Data
public class Person {
/** 編碼 */
private String code;
/** 名字 */
private String name;
public Person(String code, String name) {
this.code = code;
this.name = name;
}
}
實(shí)例化三個對象放入list集合中
public static void main(String[] args) {
Person person1 = new Person("001", "張三");
Person person2 = new Person("002", "李四");
Person person3 = new Person("002", "王五");
List<Person> personList = new ArrayList<>();
personList.add(person1);
personList.add(person2);
personList.add(person3);
personList.forEach(t -> System.out.println(t.toString()));
}
輸出結(jié)果為:
Person(code=001, name=張三)
Person(code=002, name=李四)
Person(code=002, name=王五)
1.抽取對象的code作為key,name作為value轉(zhuǎn)化為map集合
方法為
private static HashMap<String, String> listToMap(List<Person> personList) {
return (HashMap<String, String>)personList.stream()
.filter(t -> t.getName()!=null)
.collect(Collectors.toMap(Person::getCode,Person::getName,(k1,k2)->k2));
}
filter() 方法作用是過濾掉名字為空的對象,當(dāng)對象的名字為null時,會出現(xiàn)NPE空指針異常
(k1,k2)->k2 意思是遇到相同的key時取第二個值
(k1,k2)->k1 意思是遇到相同的key時取第一個值
調(diào)用這個方法
HashMap<String,String> personMap = listToMap(personList); personMap.forEach((k,v)-> System.out.println(k.toString() + " - " + v.toString()));
輸出結(jié)果為:
001 - 張三
002 - 王五
2.抽取對象的name得到name的list集合
方法為
private static List<String> getNameList(List<Person> personList) {
return personList.stream().map(Person::getName).collect(Collectors.toList());
}
調(diào)用這個方法
List<String> nameList = getNameList(personList); nameList.forEach(t -> System.out.println(t.toString()));
輸出結(jié)果為:
張三
李四
王五
補(bǔ)充:java8 使用stream將List轉(zhuǎn)成Map,或者從List對象中獲取單個屬性List,List中根據(jù)某個字段排序
1.學(xué)生類
import lombok.Data;
@Data
public class Student{
private String stuId;
private String name;
private String age;
private String sex;
}
2.測試類
public class Test {
public static void main(String[] args) {
// 創(chuàng)建學(xué)生List
List<Student> list = createStudentList();
// 1.獲取value為Student對象,key為學(xué)生ID的Map
getStudentObjectMap(list);
// 2.獲取value為學(xué)生姓名,key為學(xué)生ID的Map
getStudentNameMap(list);
// 3.獲取學(xué)生姓名List
getStudentNameList(list);
//4.List中刪除學(xué)生id = 1的對象
list.removeIf(student -> student.getStuId().equals(1));
//5.如果StudentId為Long類型如何轉(zhuǎn)?
Map<String, String> mapStr = list.stream().collect(Collectors.toMap(student -> student.getStuId().toString(), student -> JSON.toJSONString(student)));
//6.根據(jù)List中Student的學(xué)生姓名排序
Collections.sort(list, (o1, o2) -> {
if (o1.getName().compareTo(o2.getName()) > 0) {
return 1;
} else if (o1.getName().compareTo(o2.getName()) < 0) {
return -1;
} else {
return 0;
}
});
//7.List遍歷
List<String> listStr = new ArrayList<>();
List<Student> listStu = new ArrayList<>();
listStr.forEach(studentStr -> {
listStu.add(JSON.parseObject(studentStr, Student.class));
});
//List根據(jù)某個字段過濾、排序
listStu.stream()
.filter(student -> student.getSex().equals("女"))
.sorted(Comparator.comparing(Student::getName))
.collect(Collectors.toList());
//List根據(jù)某個字段分組
Map<String,List<Student>> sexGroupMap = listStu.stream()
.collect(Collectors.groupingBy(Student::getSex));
//如果Map中多個名稱相同,則studentId用逗號間隔
Map<String,String> studentNameIdMap = listStu.stream()
.collect(toMap(Student::getName,Student::getStuId,(s,a)->s+","+a));
}
public static List<Student> createStudentList() {
List<Student> list = new ArrayList<Student>();
Student lily = new Student();
lily.setStuId("1");
lily.setName("lily");
lily.setAge("14");
lily.setSex("女");
Student xiaoming = new Student();
xiaoming.setStuId("2");
xiaoming.setName("xiaoming");
xiaoming.setAge("15");
xiaoming.setSex("男");
list.add(lily);
list.add(xiaoming);
return list;
}
public static Map<Object, Object> getStudentObjectMap(List<Student> list) {
Map<Object, Object> map = list.stream().collect(Collectors.toMap(Student::getStuId, student -> student));
map.forEach((key, value) -> {
System.out.println("key:" + key + ",value:" + value);
});
return map;
}
public static Map<String, String> getStudentNameMap(List<Student> list) {
Map<String, String> map = list.stream().collect(Collectors.toMap(Student::getStuId, Student::getName));
map.forEach((key, value) -> {
System.out.println("key:" + key + ",value:" + value);
});
return map;
}
public static List<String> getStudentNameList(List<Student> list) {
List<String> result = list.stream().map(student -> student.getName()).collect(Collectors.toList());
for (String name : result) {
System.out.println("name:" + name);
}
return result;
}
}
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
java接收文件流+response.body()調(diào)用兩次問題(分別接收文件和對象)
這篇文章主要介紹了java接收文件流+response.body()調(diào)用兩次問題(分別接收文件和對象),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Java使用POI-TL實(shí)現(xiàn)生成有個性的簡歷
POI-TL?是一個基于?Apache?POI?的?Java?庫,專注于在?Microsoft?Word?文檔(.docx?格式)中進(jìn)行模板填充和動態(tài)內(nèi)容生成,下面我們看看如何使用POI-TL生成有個性的簡歷吧2024-11-11
Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03
Java FileInputStream與FileOutputStream使用詳解
這篇文章主要介紹了Java FileInputStream與FileOutputStream使用詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
SpringBoot?AOP中JoinPoint的使用方式和通知切點(diǎn)表達(dá)式
這篇文章主要介紹了SpringBoot?AOP中JoinPoint的使用方式和通知切點(diǎn)表達(dá)式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Java項(xiàng)目開發(fā)命名規(guī)范(動力節(jié)點(diǎn)Java學(xué)院整理)
定義這個規(guī)范的目的是讓項(xiàng)目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項(xiàng)目組中因?yàn)閾Q人而帶來的損失。下面給大家分享java開發(fā)命名規(guī)范,一起看看吧2017-03-03
SpringBoot注冊web組件的實(shí)現(xiàn)方式
Servlet是Java Web應(yīng)用程序的基礎(chǔ),它提供了處理客戶端請求的機(jī)制,Servlet三大組件是指Servlet、Filter和Listener,它們是Java Web應(yīng)用程序的核心組件,本文將給大家介紹一下SpringBoot注冊web組件的實(shí)現(xiàn)方式,需要的朋友可以參考下2023-10-10

