对于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());
}
原文链接