如何在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());
}

原文链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容

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