如何在Java中转换List和Array

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

List 转 Array

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

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

import java.util.List;
public class ListToArrayConvertor {
    public String[] convert(List<String> 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<String> stringList;
    List<Integer> integerList;

    @Before
    public void setUp() {
        listToArrayConvertor = new ListToArrayConvertor();
        /*List of String*/
        stringList = new ArrayList<String>();
        stringList.add("Java");
        stringList.add("C++");
        stringList.add("JavaScript");
        stringList.add("TypeScript");
        /*List of Integer*/
        integerList = new ArrayList<Integer>();
        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<String> 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<Integer> 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<Integer> 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:

<dependency>
   <groupId>commons-lang</groupId>
   <artifactId>commons-lang</artifactId>
   <version>2.6</version>
</dependency>

测试代码如下:

@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:

<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>25.0-jre</version>
</dependency>

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

public int[] convertWithGuava(List<Integer> 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<String> convert(String[] strArray){
        return Arrays.asList(strArray);
    }
}

使用Commons Collection将Array 转为 List

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

<dependency>
     <groupId>commons-collections</groupId>
     <artifactId>commons-collections</artifactId>
     <version>3.2.2</version>
</dependency>

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

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

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

测试用例如下:

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

使用Guava 将Array转为List

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

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

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

测试用例如下:

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

原文链接

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,584评论 1 92
  • 昨天午休时间,正在办公室全神贯注地看着美剧《金装律师》,突然感觉屋里昏昏暗暗,走出屋外,黑云压城,五分钟之内,倾盆...
    盖子团长阅读 338评论 0 0
  • 我又没忍住! 上学四天,每天回家写作业写到十点!为什么呢? 确切地说,是磨蹭到十点! 一回家,我饿了,要吃饭! 吃...
    锦瑟_db50阅读 136评论 0 0
  • 当舰娘OP随着一句巨燃的『weigh anchor』响起。当新妹又开始闪现圣光,冲向十八禁。当东京吃货的废柴男主终...
    jay4497阅读 223评论 0 1