Java将List中对象的某一列转换为Set

 更新时间:2025年12月19日 08:37:02   作者:悟能不能悟  
这篇文章主要为大家详细介绍了Java如何实现将List中对象的某一列转换为Set,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在 Java 中将 List 中对象的某一列转换为 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)  // 重复的张三
        );
        
        // 方法1:提取 name 列到 Set(自动去重)
        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 实现

// 使用 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. 复杂对象属性提取

// 如果属性是嵌套对象
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. 并行流处理(大数据量时)

Set<String> nameSet = personList.parallelStream()  // 并行处理
    .map(Person::getName)
    .collect(Collectors.toSet());

6. 传统方法(不使用 Stream)

// 传统 for 循环
Set<String> nameSet = new HashSet<>();
for (Person person : personList) {
    nameSet.add(person.getName());
}

// 传统 for 循环,处理 null
Set<String> nameSet = new HashSet<>();
for (Person person : personList) {
    if (person.getName() != null) {
        nameSet.add(person.getName());
    }
}

主要区别对比

方法优点缺点
Stream API代码简洁,可读性好,支持链式调用Java 8+
并行流大数据量性能好线程安全需注意
传统循环兼容性好,Java 8 以下可用代码冗长

最佳实践建议

  • 推荐使用 Stream API:代码简洁,可读性好
  • 考虑使用 LinkedHashSet:如果需要保持顺序
  • 总是处理 null 值:避免 NullPointerException
  • 大数据量考虑并行流:但要注意线程安全问题
  • 使用具体类型:明确指定 Set 的实现类型,便于维护

到此这篇关于Java将List中对象的某一列转换为Set的文章就介绍到这了,更多相关Java List对象转Set内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot利用Redis解决海量重复提交问题

    SpringBoot利用Redis解决海量重复提交问题

    本文主要介绍了SpringBoot利用Redis解决海量重复提交问题,介绍了三种常见的解决方案,包括使用Redis计数器,使用Redis分布式锁和使用Redis发布/订阅机制,感兴趣的可以了解一下
    2024-03-03
  • java实现多线程文件的断点续传

    java实现多线程文件的断点续传

    这篇文章主要为大家详细介绍了java实现多线程文件的断点续传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详解idea从git上拉取maven项目详细步骤

    详解idea从git上拉取maven项目详细步骤

    这篇文章主要介绍了详解idea从git上拉取maven项目详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 以实例简介Java中线程池的工作特点

    以实例简介Java中线程池的工作特点

    这篇文章主要介绍了以实例简介Java中线程池的工作特点,线程池是Java实现多线程编程的基础,需要的朋友可以参考下
    2015-09-09
  • Oracle JDBC连接BUG解决方案

    Oracle JDBC连接BUG解决方案

    这篇文章主要介绍了Oracle JDBC连接BUG解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤

    基于Java配置选项,可以编写大多数的Spring不用配置XML,下面这篇文章主要给大家介绍了关于在Spring中基于Java类进行配置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • SpringBoot详解整合Spring Boot Admin实现监控功能

    SpringBoot详解整合Spring Boot Admin实现监控功能

    这篇文章主要介绍了SpringBoot整合Spring Boot Admin实现服务监控,内容包括Server端服务开发,Client端服务开发其中Spring Boot Admin还可以对其监控的服务提供告警功能,如服务宕机时,可以及时以邮件方式通知运维人员,感兴趣的朋友跟随小编一起看看吧
    2022-07-07
  • Java小程序赛马游戏实现过程详解

    Java小程序赛马游戏实现过程详解

    这篇文章主要介绍了Java小程序赛马游戏实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java如何获取本地操作系统进程列表

    java如何获取本地操作系统进程列表

    本文介绍了java中是如何获取当前本地操作系统正在运行的系统进程的信息,需要的朋友可以参考下
    2015-07-07
  • Java实现短信验证码功能的完整代码

    Java实现短信验证码功能的完整代码

    这篇文章主要为大家详细介绍了Java实现短信验证码功能的完整代码,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2025-12-12

最新评论