杰瑞科技汇

java set 转 list

方法 代码示例 优点 缺点 适用场景
构造函数法 new ArrayList<>(mySet); 最推荐,代码简洁,性能好,语义清晰 无明显缺点 几乎所有情况下的首选
Java 8 Stream API mySet.stream().collect(Collectors.toList()); 功能强大,可链式操作,支持并行流 代码稍长,对于简单转换略显繁琐 需要在转换过程中进行其他操作(如过滤、映射)

使用 ArrayList 的构造函数(最推荐)

这是最直接、最高效、最常用的方法。ArrayList 类提供了一个可以接受任何 Collection(包括 Set)作为参数的构造函数,它会自动将集合中的所有元素复制到新的 ArrayList 实例中。

java set 转 list-图1
(图片来源网络,侵删)

代码示例

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class SetToListExample {
    public static void main(String[] args) {
        // 1. 创建一个 Set
        Set<String> fruitSet = new HashSet<>();
        fruitSet.add("Apple");
        fruitSet.add("Banana");
        fruitSet.add("Orange");
        fruitSet.add("Apple"); // Set 会自动去重
        System.out.println("原始 Set: " + fruitSet);
        // 输出可能为: [Orange, Apple, Banana] (HashSet 不保证顺序)
        // 2. 使用 ArrayList 的构造函数将 Set 转换为 List
        List<String> fruitList = new ArrayList<>(fruitSet);
        System.out.println("转换后的 List: " + fruitList);
        // 输出可能为: [Orange, Apple, Banana] (ArrayList 会保持 Set 的迭代顺序)
    }
}

优点

  • 简洁高效:一行代码即可完成,性能非常好,因为底层是直接复制元素。
  • 语义清晰new ArrayList<>(collection) 的意图非常明确,就是根据一个现有集合创建一个新的列表。
  • 保持顺序:从 Java 8 开始,HashSet 等集合的迭代顺序是稳定且可预测的(尽管不是插入顺序),转换后的 ArrayList 会完全保留 Set 的迭代顺序。

使用 Java 8 Stream API

如果你正在使用 Java 8 或更高版本,可以利用 Stream API 来完成转换,这种方法虽然对于单纯的转换来说有点“杀鸡用牛刀”,但它非常灵活,特别是当你想在转换的同时进行其他操作时。

代码示例

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SetToListStreamExample {
    public static void main(String[] args) {
        // 1. 创建一个 Set
        Set<Integer> numberSet = Set.of(10, 20, 30, 40, 50); // Java 9+ 的便捷创建方式
        System.out.println("原始 Set: " + numberSet);
        // 2. 使用 Stream API 将 Set 转换为 List
        List<Integer> numberList = numberSet.stream() // 1. 创建一个流
                                          .collect(Collectors.toList()); // 2. 收集为 List
        System.out.println("转换后的 List: " + numberList);
    }
}

优点

  • 灵活性高:可以在 stream()collect() 之间插入中间操作,如 filter()map()sorted() 等。
  • 支持并行流:可以轻松地通过 .parallelStream() 来实现并行处理,提高大数据量下的处理速度。

适用场景示例(带过滤)

假设你只想将 Set 中大于 25 的数字转换为 List。

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SetToListWithFilter {
    public static void main(String[] args) {
        Set<Integer> numberSet = Set.of(10, 20, 30, 40, 50);
        // 使用 Stream API 进行转换和过滤
        List<Integer> filteredList = numberSet.stream()
                .filter(number -> number > 25) // 过滤掉小于等于25的元素
                .collect(Collectors.toList());
        System.out.println("过滤后的 List: " + filteredList); // 输出: [30, 40, 50]
    }
}

特殊情况:转换为不可变 List

如果你不希望转换后的 List 被修改(即添加、删除或更改元素),你可以创建一个不可变的列表。

使用 List.copyOf() (Java 10+)

这是最现代、最简单的方法。

java set 转 list-图2
(图片来源网络,侵删)
import java.util.List;
import java.util.Set;
import java.util.HashSet;
public class ImmutableListExample {
    public static void main(String[] args) {
        Set<String> originalSet = new HashSet<>();
        originalSet.add("A");
        originalSet.add("B");
        // 使用 List.copyOf() 创建不可变 List
        List<String> immutableList = List.copyOf(originalSet);
        System.out.println("不可变 List: " + immutableList);
        // 以下操作会抛出 UnsupportedOperationException 异常
        // immutableList.add("C");
        // immutableList.remove("A");
    }
}

使用 Collectors.toUnmodifiableList() (Java 10+)

在 Stream API 中使用。

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class UnmodifiableListStreamExample {
    public static void main(String[] args) {
        Set<Integer> numberSet = Set.of(1, 2, 3);
        List<Integer> unmodifiableList = numberSet.stream()
                .collect(Collectors.toUnmodifiableList());
        System.out.println("不可变 List: " + unmodifiableList);
    }
}

总结与建议

场景 推荐方法
简单地将 Set 转换为 List new ArrayList<>(mySet) (首选,最简单高效)
需要在转换时进行过滤、映射等操作 mySet.stream().filter(...).collect(Collectors.toList())
需要创建一个不可变的 List List.copyOf(mySet)mySet.stream().collect(Collectors.toUnmodifiableList())

对于绝大多数日常开发需求,直接使用 new ArrayList<>(yourSet) 是最简单、最直观且性能最好的选择。

java set 转 list-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇