如何在 Java 中将集合转换为列表

在Java中,列表是对数据的有序收集,而集合是对数据的无序收集。

知道如何将一个集合转换为列表是有用的,它可以将未排序的数据转换为排序的数据。

初始化一套

让我们初始化一个集,并添加一些元素。

 1import java.util.*;
 2
 3public class Main {
 4
 5    public static void main(String[] args)
 6    {
 7        Set<Integer> a = new HashSet<>();
 8        a.add(1);
 9        a.add(2);
10        a.add(3);
11        a.add(1);
12        System.out.println(a);
13    }
14}

Set

HashSet的 add() 方法将元素添加到集合中. 注意元素是不同的。

在 Java 中将 Set 转换为列表

让我们将集合转换为列表. 有多种方法可以这样做. 每种方式都不同,这些差异是微妙的。

1. 列表构建器 与 Set 参数

将集合转换为列表的最简单的方法是通过将集合作为参数在创建列表时。

 1import java.util.*;
 2
 3public class Main {
 4
 5    public static void main(String[] args)
 6    {
 7        Set<Integer> a = new HashSet<>();
 8        a.add(1);
 9        a.add(2);
10        a.add(3);
11        a.add(1);
12
13     List<Integer> arr = new ArrayList<>(a);
14     System.out.println(arr);
15     System.out.println(arr.get(1));
16
17    }
18}

Using Constructor

由于集被转换为列表,现在元素被排序,这意味着我们可以使用 get() 方法访问元素按索引。

二、使用常规循环

我们可以使用好的旧 for loop 来明确地将元素从集合复制到列表中。

 1import java.util.*;
 2
 3public class Main {
 4
 5    public static void main(String[] args)
 6    {
 7        Set<Integer> a = new HashSet<>();
 8        a.add(1);
 9        a.add(2);
10        a.add(3);
11        a.add(1);
12
13     List<Integer> arr = new ArrayList<>(a);
14        for (int i : a)
15            arr.add(i);
16        System.out.println(arr);
17        System.out.println(arr.get(1));
18    }   
19}

Using for-loop

因为循环通过组件元素,并将元素添加到列表中。

列表 addAll() 方法

列表有一个名为addAll() 的方法,该方法可以同时将多个值添加到列表中。

 1import java.util.*;
 2
 3public class Main {
 4
 5    public static void main(String[] args)
 6    {
 7        Set<Integer> a = new HashSet<>();
 8        a.add(1);
 9        a.add(2);
10        a.add(3);
11        a.add(1);
12
13     List<Integer> arr = new ArrayList<>();
14        arr.addAll(a);
15        System.out.println(arr);
16        System.out.println(arr.get(1));
17    }
18}

Using addAll()

流式 API 收集() 方法

**Stream.collect()**可从 Java 8开始使用。 ToList收集器将所有流元素收集到一个列表实例中。

 1import java.util.*;
 2import java.util.stream.Collectors;
 3
 4public class Main {
 5
 6    public static void main(String[] args)
 7    {
 8        Set<Integer> a = new HashSet<>();
 9        a.add(1);
10        a.add(2);
11        a.add(3);
12        a.add(1);
13
14     List<Integer> arr;
15
16        arr = a.stream().collect(Collectors.toList());
17        System.out.println(arr);
18        System.out.println(arr.get(1));
19    }
20}

using stream.collect()

对于 **stream.collect()**的 文档提到,对返回列表的类型、可变性、可序列化性或线程安全性没有任何保证。

若要指定列表类型,请使用 toCollection(ArrayList::new)

 1import java.util.*;
 2import java.util.stream.Collectors;
 3
 4public class Main {
 5
 6    public static void main(String[] args)
 7    {
 8        Set<Integer> a = new HashSet<>();
 9        a.add(1);
10        a.add(2);
11        a.add(3);
12        a.add(1);
13
14     List<Integer> arr;
15
16  arr = a.stream().collect(Collectors.toCollection(ArrayList::new));
17        System.out.println(arr);
18        System.out.println(arr.get(1));
19    }
20}

推荐阅读: Java流

二、代码(代码)方法

Java 10 onwards 列表有一个 copyOf() 方法. 该方法返回一个 unmodifiable 列表 包含给定集合的元素,其迭代顺序。

 1import java.util.*;
 2import java.util.stream.Collectors;
 3
 4public class Main {
 5
 6    public static void main(String[] args)
 7    {
 8        Set<Integer> a = new HashSet<>();
 9        a.add(1);
10        a.add(2);
11        a.add(3);
12        a.add(1);
13
14     List<Integer> arr;
15
16        arr = List.copyOf(a);
17        System.out.println(arr);
18        System.out.println(arr.get(1));
19    }
20}

using List.copyOf()

在集合中添加一个 null 并尝试将其转换为列表:

 1import java.util.*;
 2import java.util.stream.Collectors;
 3
 4public class Main {
 5
 6    public static void main(String[] args)
 7    {
 8        Set<Integer> a = new HashSet<>();
 9        a.add(1);
10        a.add(2);
11        a.add(3);
12        a.add(1);
13        a.add(null);
14
15     List<Integer> arr;
16
17        arr = List.copyOf(a);
18        System.out.println(arr);
19        System.out.println(arr.get(1));
20    }
21}

Null Pointer Exception

如果您尝试将项目添加到不可更改的列表中,您将收到一个错误,该错误看起来如下。

Immutable Error

使用 addAll() 方法将包含 null 元素的集合转换为列表:

 1import java.util.*;
 2import java.util.stream.Collectors;
 3
 4public class Main {
 5
 6    public static void main(String[] args)
 7    {
 8        Set<Integer> a = new HashSet<>();
 9        a.add(1);
10        a.add(2);
11        a.add(3);
12        a.add(1);
13        a.add(null);
14
15     List<Integer> arr = new ArrayList<>();
16     arr.addAll(a);
17
18      //  arr = List.copyOf(a);
19        System.out.println(arr);
20        System.out.println(arr.get(1));
21    }
22}

AddAll() with Null

请注意, null 显示在列表的开始。

结论

我们看到了一些非常有趣的方法来将一组转换为列表. 重要的是要注意从每个方法中创建的列表类型. 例如 copyOf() 方法产生一个 不变的列表,不能处理 null 元素。

Published At
Categories with 技术
comments powered by Disqus