如何在Java中转换List和Array

对于Java开发人员来说,在工作中,经常会遇见需要将List和Array之间相互转换的情景。数组和列表转换是有很多种方法的,在这篇文章中,我将讨论在列表对象和数组之间转换数据的各种方法。

List 转 Array

list接口附带toArray()方法,该方法以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。 返回数组的类型是您作为参数传递的数组的类型。

将列表转换为数组的ListToArrayConvertor类如下所示:
Listtoarrayconvertor.java

import java.util.List;
public class ListToArrayConvertor {
    public String[] convert(List list) {
        return list.toArray(new String[list.size()]);
    }
}

接下来写一个JUnit测试用例,代码如下:
Listtoarrayconvertortest.java


import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

public class ListToArrayConvertorTest {
    ListToArrayConvertor listToArrayConvertor;
    List stringList;
    List integerList;

    @Before
    public void setUp() {
        listToArrayConvertor = new ListToArrayConvertor();
        /*List of String*/
        stringList = new ArrayList();
        stringList.add("Java");
        stringList.add("C++");
        stringList.add("JavaScript");
        stringList.add("TypeScript");
        /*List of Integer*/
        integerList = new ArrayList();
        integerList.add(21);
        integerList.add(12);
        integerList.add(3);
    }

    @After
    public void tearDown() {
        listToArrayConvertor = null;
        stringList = null;
        integerList = null;
    }

    @Test
    public void convert() {
        String[] languages = listToArrayConvertor.convert(stringList);
        assertNotNull(languages);
        assertEquals(stringList.size(), languages.length);
    }
}

这个测试用例调用了convert()方法。首先,判断返回的值是否为null。其次,判断返回的数组长度是否和列表长度相等。

使用Java 8 Stream 将List转为Array

通过在Java 8中引入Stream,您可以将List转换为连续的元素流。从集合中获取流作为流对象后,可以调用Stream.toArray()方法,该方法返回包含此流的元素的数组。
使用Stream将List转换为Array的代码如下:

public String[] convertWithStream(List list) {
    return list.stream().toArray(String[]::new);
}

JUnit测试代码如下所示:

@Test
public void convertWithStream() {
    String[] languages = listToArrayConvertor.convertWithStream(stringList);
    assertNotNull(languages);
    assertEquals(stringList.size(), languages.length);
}

List转为原始Array

当我们调用toArray()方法的时候,得到的是包装数组,比如:Integer[], Double[] 和 Boolean[]。当我需要原始的数组类型的时候呢,列如:int[], double[], boolean[]。

一种方法是自己进行替换,如下所示:

public int[] convertAsPrimitiveArray(List list) {
    int[] ints = new int[list.size()];
    for (int i = 0; i < list.size(); i ++) {
        ints[i] = list.get(i);
    }
    return ints;
}

第二种方法是使用Java 8 的Stream:

public int[] convertAsPrimitiveArrayWithStream(List list) {
    return list.stream().mapToInt(i->i).toArray();
}

另一种方法是使用Apache Commons Lang将列表转换为基本数组。

使用Apache Commons Lang 将List转为原始Array

Apache Commons Lang为常用功能和操作核心Java类的方法提供了额外的方法,这些方法在标准Java库中是不可用的。
要使用Commons Lang,请将以下依赖项添加到Maven POM:


   commons-lang
   commons-lang
   2.6

测试代码如下:

@Test
public void convertWithApacheCommons() {
    int[] numbers =  listToArrayConvertor.convertWithApacheCommons(integerList);
    assertNotNull(numbers);
    assertEquals(integerList.size(),numbers.length);
}

使用Guava 将List转为 原始Array

Guava是由Google开发和维护的项目,由Java开发人员广泛使用的几个库组成。 要使用Guava,请将以下依赖项添加到Maven POM:


   com.google.guava
   guava
   25.0-jre

Guava包含了几个类,比如: Ints, Longs, Floats, Doubles和Booleans,使用标准Java包装器类中尚不存在的实用方法。
Guava包装类带有一个toArray()方法,该方法返回一个原始数组,该数组包含传递给它的集合的每个值。
使用Guava将list转换为原始数组类型代码如下所示:

public int[] convertWithGuava(List list){
    return Ints.toArray(list);
}

下面是测试代码:

@Test
public void convertWithGuava() {
    int[] languages =  listToArrayConvertor.convertWithGuava(integerList);
    assertNotNull(languages);
    assertEquals(integerList.size(),languages.length);
}

将Array转为List

要将数组转换为列表,可以使用Arrays.asList()方法。 此方法从传递给它的数组元素返回固定大小的列表。

Arraytolistconverter.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayToListConverter {
    public List convert(String[] strArray){
        return Arrays.asList(strArray);
    }
}

使用Commons Collection将Array 转为 List

在使用Commons Collection之前,需要将一下依赖添加到Maven POM:


     commons-collections
     commons-collections
     3.2.2

CollectionUtils是Commons Collection中的一个类,它为forCollection实例提供实用程序方法和装饰器。 您可以使用CollectionUtils的addAll()方法将数组转换为列表。 此方法采用集合和数组的参数。 此方法将数组中存在的所有元素添加到集合中。

使用Commons Collection中的CollectionUtils类将数组转换为列表的代码如下所示:

public List convertWithApacheCommons(String[] strArray){
    List strList = new ArrayList<>(strArray.length);
    CollectionUtils.addAll(strList, strArray);
    return strList;
}

测试用例如下:

@Test
public void convertWithApacheCommons() {
    List languageList = arrayToListConverter.convertWithApacheCommons(stringArray);
    assertNotNull(languageList);
    assertEquals(stringArray.length,languageList.size());
}

使用Guava 将Array转为List

Guava使用带有静态实用程序方法的列表类来处理List对象。 您可以使用lists类的newArrayList()方法将数组转换为列表。 newArrayList()方法接受一个数组并返回一个已使用数组元素初始化的ArrayList。

使用Guava的lists类将数组转换为列表的代码如下所示:

public List convertWithGuava(String[] strArray){
    return Lists.newArrayList(strArray);
}

测试用例如下:

@Test
public void convertWithGuava() {
    List languageList = arrayToListConverter.convertWithGuava(stringArray);
    assertNotNull(languageList);
    assertEquals(stringArray.length,languageList.size());
}

原文链接

你可能感兴趣的:(如何在Java中转换List和Array)