Java將List中對(duì)象的某一列轉(zhuǎn)換為Set
在 Java 中將 List 中對(duì)象的某一列轉(zhuǎn)換為 Set,有幾種常用方法:
1. 使用 Stream API(最常用)
import java.util.*;
import java.util.stream.Collectors;
// 示例類
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
public class Main {
public static void main(String[] args) {
List<Person> personList = Arrays.asList(
new Person("張三", 25),
new Person("李四", 30),
new Person("王五", 25),
new Person("張三", 28) // 重復(fù)的張三
);
// 方法1:提取 name 列到 Set(自動(dòng)去重)
Set<String> nameSet = personList.stream()
.map(Person::getName) // 提取 name
.collect(Collectors.toSet());
System.out.println(nameSet); // [張三, 李四, 王五]
// 方法2:提取 age 列到 Set
Set<Integer> ageSet = personList.stream()
.map(Person::getAge)
.collect(Collectors.toSet());
System.out.println(ageSet); // [25, 30, 28]
}
}2. 指定具體的 Set 實(shí)現(xiàn)
// 使用 HashSet
Set<String> nameSet = personList.stream()
.map(Person::getName)
.collect(Collectors.toCollection(HashSet::new));
// 使用 TreeSet(排序)
Set<String> sortedNameSet = personList.stream()
.map(Person::getName)
.collect(Collectors.toCollection(TreeSet::new));
// 使用 LinkedHashSet(保持插入順序)
Set<String> linkedNameSet = personList.stream()
.map(Person::getName)
.collect(Collectors.toCollection(LinkedHashSet::new));3. 處理可能為 null 的情況
// 方法1:過濾掉 null
Set<String> nameSet = personList.stream()
.map(Person::getName)
.filter(Objects::nonNull) // 過濾 null
.collect(Collectors.toSet());
// 方法2:使用 filter 和 Optional
Set<String> nameSet = personList.stream()
.map(Person::getName)
.filter(name -> name != null && !name.trim().isEmpty()) // 過濾 null 和空字符串
.collect(Collectors.toSet());4. 復(fù)雜對(duì)象屬性提取
// 如果屬性是嵌套對(duì)象
class Department {
private String deptName;
// getters and setters
}
class Employee {
private String name;
private Department department;
// getters and setters
}
// 提取嵌套屬性
Set<String> deptNames = employeeList.stream()
.map(Employee::getDepartment)
.filter(Objects::nonNull)
.map(Department::getDeptName)
.collect(Collectors.toSet());5. 并行流處理(大數(shù)據(jù)量時(shí))
Set<String> nameSet = personList.parallelStream() // 并行處理
.map(Person::getName)
.collect(Collectors.toSet());6. 傳統(tǒng)方法(不使用 Stream)
// 傳統(tǒng) for 循環(huán)
Set<String> nameSet = new HashSet<>();
for (Person person : personList) {
nameSet.add(person.getName());
}
// 傳統(tǒng) for 循環(huán),處理 null
Set<String> nameSet = new HashSet<>();
for (Person person : personList) {
if (person.getName() != null) {
nameSet.add(person.getName());
}
}主要區(qū)別對(duì)比
| 方法 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| Stream API | 代碼簡潔,可讀性好,支持鏈?zhǔn)秸{(diào)用 | Java 8+ |
| 并行流 | 大數(shù)據(jù)量性能好 | 線程安全需注意 |
| 傳統(tǒng)循環(huán) | 兼容性好,Java 8 以下可用 | 代碼冗長 |
最佳實(shí)踐建議
- 推薦使用 Stream API:代碼簡潔,可讀性好
- 考慮使用 LinkedHashSet:如果需要保持順序
- 總是處理 null 值:避免 NullPointerException
- 大數(shù)據(jù)量考慮并行流:但要注意線程安全問題
- 使用具體類型:明確指定 Set 的實(shí)現(xiàn)類型,便于維護(hù)
到此這篇關(guān)于Java將List中對(duì)象的某一列轉(zhuǎn)換為Set的文章就介紹到這了,更多相關(guān)Java List對(duì)象轉(zhuǎn)Set內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot3集成Swagger3的詳細(xì)教程
Swagger 3(OpenAPI 3.0)提供了更加強(qiáng)大和靈活的API文檔生成能力,本教程將指導(dǎo)您如何在Spring Boot 3項(xiàng)目中集成Swagger3,并使用Knife4j作為UI界面,需要的朋友可以參考下2024-03-03
Java實(shí)現(xiàn)簡單的RPC框架的示例代碼
本篇文章主要介紹了Java實(shí)現(xiàn)簡單的RPC框架的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
SpringBoot服務(wù)開啟后通過端口訪問無反應(yīng)的解決
這篇文章主要介紹了SpringBoot服務(wù)開啟后通過端口訪問無反應(yīng)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
jstack報(bào)錯(cuò)Unable to open socket file解決
這篇文章主要為大家介紹了jstack報(bào)錯(cuò)Unable to open socket file的解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02
Java實(shí)現(xiàn)TXT文件導(dǎo)入功能的詳細(xì)步驟
在實(shí)際開發(fā)中,很多應(yīng)用場景需要將用戶上傳的 TXT 文件進(jìn)行解析,并將文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫或其他存儲(chǔ)系統(tǒng)中,本文將演示如何用 Java 實(shí)現(xiàn)一個(gè)基本的 TXT 文件導(dǎo)入功能,需要的朋友可以參考下2025-08-08
Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析
Async注解用于聲明一個(gè)方法是異步的,當(dāng)在方法上加上這個(gè)注解時(shí)將會(huì)在一個(gè)新的線程中執(zhí)行該方法,而不會(huì)阻塞原始線程,這篇文章主要給大家介紹了關(guān)于Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析的相關(guān)資料,需要的朋友可以參考下2024-07-07

